Aguilina
Интересующийся
Offline
Пол:
|
|
« : 17-11-2010 12:04 » |
|
Всем добрый день! Такая проблема. Ко мне пришла заявка на устранение проблем. Касательно программы, которую уже давно написали другие люди. А выполнить ее нужно уже завтра. Вроде обычная вещь, но не знаю даже как сделать. Есть Edit и ComboBox. В Edit забивается сумма , в ComboBox выбирается валюта. Сейчас сумма вводится как череда цифр - 15645.52. Пользователям же надо чтобы когда они вводят эту сумму, она становилась такой - 15,645.52. А если вводят просто 15645 то должно выходить - 15,645.00. Я пробовала использовать маску, но она не подходит. Может поставить условие, чтобы при выборе валюты сумма становилась такой как надо. Подскажите плз какие нить еще варианты.
|
|
|
Записан
|
|
|
|
NeferSky
Постоялец
Offline
Бессмертный
|
|
« Ответ #1 : 17-11-2010 13:57 » |
|
Ну... Можно попробовать использовать событие OnChange Edit'а, с условием на заданные знаки препинания... Видимо, будет много if'ов... И скорее всего, само число типа integer придется держать в переменной, а в Edit'е выводить результат "пунктуационной" обработки этого числа типа string...
|
|
|
Записан
|
Не тронь налаженный механизм, и он тебя не подведет. Делать надо хорошо, а плохо - само получится.
|
|
|
RXL
|
|
« Ответ #2 : 17-11-2010 15:14 » |
|
Aguilina, нужно форматировать при выводе?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Aguilina
Интересующийся
Offline
Пол:
|
|
« Ответ #3 : 18-11-2010 03:31 » |
|
RXL Нужно форматировать при вводе. Чтобы пользователь мог набрать простой набор чисел 652365, а когда кликает после ввода на любой другой компоненте на форме, тогда введенный набор чисел должен преобразоваться в 652,365.00. Форма сейчас выглядит как на приложенной картинке. На самом деле на ней еще больше компонент, я убрала все лишние дабы облегчить решение задачи.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #4 : 18-11-2010 04:13 » |
|
Используй событие OnEnter и OnExit: на первом вставляй в поле редактирования нормальное число, а при втором - форматированную AnsiString::FormatFloat() строку.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Aguilina
Интересующийся
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
|
|
« Ответ #6 : 18-11-2010 06:37 » |
|
Aguilina, храни введенное число в переменной. Эту переменную при открытии формы надо инициализировать.
ShowMessage показывает строку в отдельном модальном окне. Вставить текст в поле:
Edit1.Text := amt;
|
|
« Последнее редактирование: 18-11-2010 06:39 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Aguilina
Интересующийся
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
Интересующийся
Offline
Пол:
|
|
« Ответ #9 : 18-11-2010 08:03 » |
|
Я знаю, что: ShowMessage - показывает строку в отдельном модальном окне. Edit1.Text := amt - Вставляет текст в поле. Но не совсем понятно что хотел этим сказать RXL. Поэтому так и написала. А вообще работа напрямую не связана с программированием. Поэтому и прошу детально расписать. Спасибо за понимание.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #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
Интересующийся
Offline
Пол:
|
|
« Ответ #11 : 18-11-2010 09:10 » |
|
to RXL Большое большущее спасибо!!! Все получилось. У меня еще вопрос - когда я повторно встаю на ранее заполненную строку, значение обнуляется, удаляется. Как сделать так, чтобы оно оставалось?
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #12 : 18-11-2010 09:46 » |
|
Обрисуй подробнее.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Aguilina
Интересующийся
Offline
Пол:
|
|
« Ответ #13 : 18-11-2010 09:59 » |
|
Запускаю программу, ввожу сумму комиссии в строке Edit1. Потом перехожу на Edit2. Если снова возвращаюсь на Edit1, строка обнуляется. Сумма, которую я заполняла ранее исчезает.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #14 : 18-11-2010 11:42 » |
|
Значит ты что-то неправильно делаешь. Показывай код.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Aguilina
Интересующийся
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
|
|
« Ответ #16 : 18-11-2010 13:11 » |
|
Ты используешь локальную переменную amt, а надо определить ее в классе (локальные определения убрать!).
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Aguilina
Интересующийся
Offline
Пол:
|
|
« Ответ #17 : 19-11-2010 06:17 » |
|
RXL
Новый класс создать ? Или в TForm определить?
|
|
« Последнее редактирование: 19-11-2010 06:21 от Aguilina »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #18 : 19-11-2010 06:56 » |
|
Конечно же в том же классе формы!
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Aguilina
Интересующийся
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
|
|
« Ответ #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
Интересующийся
Offline
Пол:
|
|
« Ответ #21 : 22-11-2010 11:10 » |
|
RXL Спасибо большое! В моей маленькой программке все заработало! Терь нужно все это в основную прогу поставить.
|
|
|
Записан
|
|
|
|
|