![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите, начинающему программисту... [D6, WinME]
Vladimiruss © (2002-09-19 18:31:00)Как сделать математические действия с Edit. Например Edit1 * Edit2 + Edit3 / Edit4, и ответ должен появиться автоматически в Edit5.
RV (2002-09-20 12:56:00) [1]val?
alena.svt (2002-09-20 12:43:00) [2]Во блин скопировала коды ваши даже на деление не посмотрела вот как надо.
Edit5.Text := FloatToStr((StrToFloat(S1) * StrToFloat(S2) +
StrToFloat(S3)) / StrToFloat(S4));
qube © (20.09.02 10:03)
Пустой текст погоняйте и выхватите мессагу.
qube (2002-09-20 10:03:00) [3]StrToXXX выбросит исключение, если число введено с ошибками.
Anatoly Podgoretsky (2002-09-20 09:06:00) [4]Во первых главное слово НАПРИМЕР, ну например так 1,5E-3
Надо проще жить, ничего на вводе не надо фильтровать, пользователь сам разберется как ему вводить, а обработать результат преобразования строки в число и если есть ошибка то выдать сообщение (саиостоятельно или позволить системе сообщить об ошибке - это уже не важно кто). Не надо мешать пользователю.
Separator (2002-09-20 08:33:00) [5]> Esu
Sorry проглядел, но думаю все поняли
Esu (2002-09-20 08:32:00) [6]
> намудрили а про backspace и прочие там delete забыли :)
BackSpace и Delete раньше перехватываются.
> Separator
Эт тоже не панацея.
> If S[I] in ["0".."9"] Then
> Result := Result + S[I] ;- тут перед else - лишняя
Separator (2002-09-20 08:30:00) [7]> Vladimiruss
Ты не обращай на то, что тут написано, а лучше купи книги. Для начала я б посоветовал "Turbo Pascal 7.0 для школьников" и что-нибудь из Архангельского, поверь, если все это прочтешь, то подобные вопросы отпадут.
Esu (2002-09-20 08:26:00) [8]
> function NET_BUKVAM(Const S:String):String;
Ну если переименовать функцию NET_BUKVAM в TOKA_CIFRI то все нормально :) Только наверное нужно было ограничиться на StrToInt(edit1.text). А то сейчас тут свой MaskEdit напишем и совсем непонятно будет :)
Separator (2002-09-20 08:21:00) [9]А где тогда DecimalSeparator, надо так:
function NET_BUKVAM(Const S:String):String;
Var
I:Integer;
DS: boolean;
begin
Result:="";
DS:= false;
If Trim(S)="" then
Exit;
for I:=1 To Length(S) Do
If S[I] in ["0".."9"] Then
Result := Result + S[I];
else If (S[I] = DecimalSeparator) and (not DS) Then
begin
Result := Result + S[I];
DS:= true
end;
end;
alena.svt (2002-09-20 08:12:00) [10]Раз уж чистыми кодами обкидываетесь без объяснения
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
procedure Edit1Change(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
function NET_BUKVAM(Const S:String):String;
Var I:Integer;
begin
Result:="";
If Trim(S)="" then Exit;
for I:=1 To Length(S) Do
If S[I] in ["0".."9"] Then Result := Result + S[I];
end;
procedure TForm1.Edit1Change(Sender: TObject);
//В Инспекторе объектов для Edit c 1 по 4 задать этот обработчик
begin
Edit1.Text:= NET_BUKVAM(Edit1.Text);
Edit2.Text:= NET_BUKVAM(Edit2.Text);
Edit3.Text:= NET_BUKVAM(Edit3.Text);
Edit4.Text:= NET_BUKVAM(Edit4.Text);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
S1, S2, S3, S4: string;
begin
try
S1 := Edit1.Text;
S2 := Edit2.Text;
S3 := Edit3.Text;
S4 := Edit4.Text;
Edit5.Text := FloatToStr(StrToFloat(S1) * StrToFloat(S2) +
StrToFloat(S3) / StrToFloat(S4));
except
on EZeroDivide do Edit5.Text:="На нуль делить нельзя";
on EConvertError do ShowMessage("Некорректные данные для выполнения операции");
end
end;
end.
Lego (2002-09-20 07:49:00) [11]хехе... и то правда :)
намудрили а про backspace и прочие там delete забыли :)
Separator (2002-09-20 07:47:00) [12]Если надо, то я могу привести пример Edita коректо работающего с всеми клавишами, но мы ведь тут не пишим это Edit. Это просто я скопировал от лего и немного подправил
Anatoly Podgoretsky (2002-09-20 07:41:00) [13]Например backspace
Separator (2002-09-20 07:39:00) [14]Чтоб в еdit нельзя было вводить другие символы, кроме цифр
alena.svt (2002-09-20 07:31:00) [15]Вы приводите человеку готовые коды поэтому я считаю что не до ужаса , а если уж и приводите то заодно и все возможные ошибки обработать бы, ведь их тут многовато.
if not(Key in ["0".."9", DecimalSeparator]) then
Key := #0; Сорри а зачем
Separator (2002-09-20 06:41:00) [16]будет лучше так:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not(Key in ["0".."9", DecimalSeparator]) then
Key := #0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
S1, S2, S3, S4: string;
begin
S1 := Edit1.Text;
S2 := Edit2.Text;
S3 := Edit3.Text;
S4 := Edit4.Text;
Edit5.Text := FloatToStr(StrToFloat(S1) * StrToFloat(S2) +
StrToFloat(S3) / StrToFloat(S4));
end
alena.svt (2002-09-20 05:49:00) [17]Не до ужаса
Lego (2002-09-20 02:52:00) [18]Во первых самое простая проверка на то что клавиши были только цифрами(через Копировать\Вставить всеравно влезут буквы, но это уже сам разберешся думаю):
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key in ["0".."9"] then
Key := Key
else
Key := #0;
end;
у остальных Edit указываешь в событии(Events) на это событие Edit1...
ну и само математическое действие :)
procedure TForm1.Button1Click(Sender: TObject);
var
S1, S2, S3, S4: string;
begin
S1 := Edit1.Text;
S2 := Edit2.Text;
S3 := Edit3.Text;
S4 := Edit4.Text;
Edit5.Text := IntToStr(StrToInt(S1) * StrToInt(S2) +
StrToInt(S3) div StrToInt(S4));
end;
Помоему разжовано до ужаса просто :)
И еще рекомендую использовать CurrencyEdit из RxLib...
Smiths (2002-09-19 18:41:00) [19]Неплохо было бы на валидность проверять.
Dmitriy Polskoy (2002-09-19 18:38:00) [20]StrToInt();