| 
			| 
					
						| 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        Спасибо большое!  В моей маленькой программке все заработало! Терь нужно все это в основную прогу поставить. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  |