Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Разрядность суммы вводимой в компоненте Edit  (Прочитано 22169 раз)
0 Пользователей и 5 Гостей смотрят эту тему.
Aguilina
Интересующийся

kz
Offline Offline
Пол: Женский

« : 17-11-2010 12:04 » 

Всем добрый день!

Такая проблема. Ко мне пришла заявка на устранение проблем. Касательно программы, которую уже давно написали другие люди. А выполнить ее нужно уже завтра. Вроде обычная вещь, но не знаю даже как сделать.
Есть Edit и ComboBox. В Edit забивается сумма , в ComboBox выбирается валюта. Сейчас сумма вводится как череда цифр - 15645.52.
Пользователям же надо чтобы когда они вводят эту сумму, она становилась такой - 15,645.52.
А если вводят просто 15645 то должно выходить - 15,645.00.
Я пробовала использовать маску, но она не подходит.   А черт его знает...
Может поставить условие, чтобы при выборе валюты сумма становилась такой как надо.
Подскажите плз какие нить еще варианты.  Скромно так...

 
Записан
NeferSky
Постоялец

ua
Offline Offline
Бессмертный


« Ответ #1 : 17-11-2010 13:57 » 

Ну... Можно попробовать использовать событие OnChange Edit'а, с условием на заданные знаки препинания... Видимо, будет много if'ов... И скорее всего, само число типа integer придется держать в переменной, а в Edit'е выводить результат "пунктуационной" обработки этого числа типа string...
Записан

Не тронь налаженный механизм, и он тебя не подведет.
Делать надо хорошо, а плохо - само получится.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 17-11-2010 15:14 » 

Aguilina, нужно форматировать при выводе?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Aguilina
Интересующийся

kz
Offline Offline
Пол: Женский

« Ответ #3 : 18-11-2010 03:31 » 

RXL Нужно форматировать при вводе. Чтобы пользователь мог набрать простой набор чисел 652365, а когда кликает после ввода на любой другой компоненте на форме, тогда введенный набор чисел должен преобразоваться в 652,365.00. Форма сейчас выглядит как на приложенной картинке. На самом деле на ней еще больше компонент, я убрала все лишние дабы облегчить решение задачи.

* Форма.JPG (41.77 Кб - загружено 949 раз.)
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 18-11-2010 04:13 » 

Используй событие OnEnter и OnExit: на первом вставляй в поле редактирования нормальное число, а при втором - форматированную AnsiString::FormatFloat() строку.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Aguilina
Интересующийся

kz
Offline Offline
Пол: Женский

« Ответ #5 : 18-11-2010 06:33 » 

А какой код внутри процедуры OnEnter написать?  Краснею

Код:
procedure TForm1.Edit1Enter(Sender: TObject);
begin
    ????
end;

Когда в OnExit пишу ShowMessage, то показывает правильно отформатированную сумму в Мессэйдж окне. Как терь сделать так чтоб это значение в том же Edit-е высвечивалось?

Код:
procedure TForm1.Edit1Exit(Sender: TObject);
begin
   ShowMessage(FormatFloat('#,##0.00', StrToFloat(Edit1.text)));
end;


Когда пишу без ShowMessage(для того, чтобы сумма отражалсь в той же компоненте Edit), то ничего не делает:  Не понял

Код:
procedure TForm1.Edit1Exit(Sender: TObject);
var
   amt:string;
begin
   amt:=FormatFloat('#,##0.00', StrToFloat(Edit1.text));
end;
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 18-11-2010 06:37 » 

Aguilina, храни введенное число в переменной. Эту переменную при открытии формы надо инициализировать.

ShowMessage показывает строку в отдельном модальном окне. Вставить текст в поле:

Edit1.Text := amt;
« Последнее редактирование: 18-11-2010 06:39 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Aguilina
Интересующийся

kz
Offline Offline
Пол: Женский

« Ответ #7 : 18-11-2010 07:02 » 

Aguilina, храни введенное число в переменной. Эту переменную при открытии формы надо инициализировать.

ShowMessage показывает строку в отдельном модальном окне. Вставить текст в поле:

Edit1.Text := amt;


Когда я делаю:
 ShowMessage(FormatFloat('#,##0.00', StrToFloat(Edit1.text)));
 Edit1.Text := amt;
Он мне все равно показывает строку в окне, а если сделать просто:
Edit1.Text := amt;
то он не форматирует сумму.

Напиши плз полностью код процедуры)
Заранее благодарю.
Записан
zubr
Гость
« Ответ #8 : 18-11-2010 07:09 » 

Код:
Edit1.Text := FormatFloat('#,##0.00', StrToFloat(Edit1.text));
Извини за нескромный вопрос: Ты работаешь или учишься?
Записан
Aguilina
Интересующийся

kz
Offline Offline
Пол: Женский

« Ответ #9 : 18-11-2010 08:03 » 

Я знаю, что:
ShowMessage - показывает строку в отдельном модальном окне.
Edit1.Text := amt - Вставляет текст в поле.

Но не совсем понятно что хотел этим сказать RXL. Поэтому так и написала.
А вообще работа напрямую не связана с программированием. Поэтому и прошу детально расписать.  Краснею

Спасибо за понимание.  Улыбаюсь
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 18-11-2010 08:27 » 

Сперва задай в форме переменную Я назвал ее someVar. Тип - Float.

Код:
procedure TForm1.Form1Create(Sender: TObject);
begin
   someVar := 0;
end;

procedure TForm1.Edit1Enter(Sender: TObject);
begin
   Edit1.Text := FormatFloat('0.00', someVar);
end;

procedure TForm1.Edit1Exit(Sender: TObject);
begin
    someVar := StrToFloat(Edit1.Text);
    Edit1.Text := FormatFloat('#,##0.00', someVar);
end;

И не забудь про контроль ввода.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Aguilina
Интересующийся

kz
Offline Offline
Пол: Женский

« Ответ #11 : 18-11-2010 09:10 » 

to RXL

Большое большущее спасибо!!!  Класс!

Все получилось.  Улыбаюсь

У меня еще вопрос - когда я повторно встаю на ранее заполненную строку, значение обнуляется, удаляется.
Как сделать так, чтобы оно оставалось?

Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 18-11-2010 09:46 » 

Обрисуй подробнее.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Aguilina
Интересующийся

kz
Offline Offline
Пол: Женский

« Ответ #13 : 18-11-2010 09:59 » 

Запускаю программу, ввожу сумму комиссии в строке Edit1. Потом перехожу на Edit2.
Если снова возвращаюсь на Edit1, строка обнуляется. Сумма, которую я заполняла ранее исчезает.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 18-11-2010 11:42 » 

Значит ты что-то неправильно делаешь. Показывай код.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Aguilina
Интересующийся

kz
Offline Offline
Пол: Женский

« Ответ #15 : 18-11-2010 11:52 » 

 Скромно так...

Код:
procedure  TForm1.FillExcel(ExSheet: variant; i: integer; const AMT:string; const CCY:string);
begin
 ExSheet.Cells[i,1]:=AMT;
 ExSheet.Cells[i,2]:=CCY;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Excel, WorkBook, Sheet1: Variant;
  xlFileName: string;
  i: integer;
  amt,ccy: string;
begin
  Excel := CreateOleObject('Excel.Application');
  Excel.WorkBooks.Open('C:\DProject\TEST\temp.xls',False);
  WorkBook := Excel.WorkBooks.Item[1];
  Sheet1 := Workbook.Sheets.Item[1];

  i:=3;

  amt:=Edit1.Text;
  ComboBox1.Text:=UpperCase(ComboBox1.Text);
  ccy:=ComboBox1.Text;

  FillExcel(Sheet1, i, AMT, CCY);

  begin
     i:=i+1;
  end;

  xlFileName:='C:\DProject\TEST\Result\NEW_.xls';
  WorkBook.SaveAs(FileName:=xlFileName,FileFormat:=xlWorkbookNormal);

  Excel.Workbooks.close;
  Excel.Quit;

  Form1.Close;

end;

procedure TForm1.FormCreate(Sender: TObject);
var
   amt:real;
begin
   amt:=1;
end;

procedure TForm1.Edit1Enter(Sender: TObject);
var
   amt:real;
begin
  Edit1.Text := FormatFloat(' ', amt);
end;

procedure TForm1.Edit1Exit(Sender: TObject);
var
   amt: real;
begin
   amt := StrToFloat(Edit1.Text);
   Edit1.Text := FormatFloat('#,##0.00', amt);
end;
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 18-11-2010 13:11 » 

Ты используешь локальную переменную amt, а надо определить ее в классе (локальные определения убрать!).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Aguilina
Интересующийся

kz
Offline Offline
Пол: Женский

« Ответ #17 : 19-11-2010 06:17 » new

RXL

Новый класс создать ? Или в TForm определить?
« Последнее редактирование: 19-11-2010 06:21 от Aguilina » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #18 : 19-11-2010 06:56 » 

Конечно же в том же классе формы!
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Aguilina
Интересующийся

kz
Offline Offline
Пол: Женский

« Ответ #19 : 19-11-2010 08:12 » 

Сделала так:

Код:
unit TESTUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Mask;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TMaskEdit;
    ComboBox1: TComboBox;
    procedure Button1Click(Sender: TObject);
    procedure Edit1Enter(Sender: TObject);
    procedure Edit1Exit(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    a: Real;
  public
    { Public declarations }
  procedure FillExcel(ExSheet: variant; i: integer; const AMT:string; const CCY:string);
  end;

var
  Form1: TForm1;

implementation

uses Excel2000, ComObj, dateutils;
{$R *.dfm}

procedure  TForm1.FillExcel(ExSheet: variant; i: integer; const AMT:string; const CCY:string);
begin
 ExSheet.Cells[i,1]:=AMT;
 ExSheet.Cells[i,2]:=CCY;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Excel, WorkBook, Sheet1: Variant;
  xlFileName: string;
  i: integer;
  amt,ccy: string;
begin
  Excel := CreateOleObject('Excel.Application');
  Excel.WorkBooks.Open('C:\DProject\TEST\temp.xls',False);
  WorkBook := Excel.WorkBooks.Item[1];
  Sheet1 := Workbook.Sheets.Item[1];

  i:=3;

  amt:=Edit1.Text;
  ComboBox1.Text:=UpperCase(ComboBox1.Text);
  ccy:=ComboBox1.Text;

  FillExcel(Sheet1, i, AMT, CCY);

  begin
     i:=i+1;
  end;

  xlFileName:='C:\DProject\TEST\Result\NEW_.xls';
  WorkBook.SaveAs(FileName:=xlFileName,FileFormat:=xlWorkbookNormal);

  Excel.Workbooks.close;
  Excel.Quit;

  Form1.Close;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   a:=1;
end;

procedure TForm1.Edit1Enter(Sender: TObject);
begin
  Edit1.Text := FormatFloat(' ', a);
end;

procedure TForm1.Edit1Exit(Sender: TObject);
begin
   a := StrToFloat(Edit1.Text);
   Edit1.Text := FormatFloat('#,##0.00', a);
end;

end.

Результат тот же.  Жаль Только не кидай меня в терновый куст!..
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #20 : 19-11-2010 11:31 » 

Aguilina, проверяй себя.

Попробовал у себя в BCB6 (окружение и API аналогично D7). Работает.

Исходники
Код:
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
    TEdit *Edit1;
    TEdit *Edit2;
    void __fastcall Edit1Enter(TObject *Sender);
    void __fastcall Edit1Exit(TObject *Sender);
private: // User declarations
    double val;
public: // User declarations
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
    val = 0;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Edit1Enter(TObject *Sender)
{
    Edit1->Text = AnsiString::FormatFloat("0.00", val);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Edit1Exit(TObject *Sender)
{
    try
    {
        val = StrToFloat(Edit1->Text);
    }
    catch (EConvertError &e)
    {
    }

    Edit1->Text = AnsiString::FormatFloat("#,##0.00", val);
}
//---------------------------------------------------------------------------
« Последнее редактирование: 19-11-2010 11:33 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Aguilina
Интересующийся

kz
Offline Offline
Пол: Женский

« Ответ #21 : 22-11-2010 11:10 » 

RXL   Отлично

 Класс!  Спасибо большое!
В моей маленькой программке все заработало! Терь нужно все это в основную прогу поставить.


Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines