ďťż

Ładny brzuch

Witam
Mam problem z kalkulatorem... Więc tak, mam 5 Editów o takich wartościach:
Edit1.Text:='20MB'; Edit2.Text:='40'; Edit3.Text:='60mb'; Edit4.Text:=''; Edit5.Text:='';
I teraz chcę to wszystko dodać :). Więc kod:
var a: Single; b: Single; c: Single; d: Single; e: Single; w: Single; begin //kod na wywalenie MB Edit1.Text:=StringReplace(Edit1.Text,'MB','',[rfReplaceAll]); Edit1.Text:=StringReplace(Edit1.Text,'mb','',[rfReplaceAll]); Edit2.Text:=StringReplace(Edit2.Text,'MB','',[rfReplaceAll]); Edit2.Text:=StringReplace(Edit2.Text,'mb','',[rfReplaceAll]); Edit3.Text:=StringReplace(Edit3.Text,'MB','',[rfReplaceAll]); Edit3.Text:=StringReplace(Edit3.Text,'mb','',[rfReplaceAll]); Edit4.Text:=StringReplace(Edit4.Text,'MB','',[rfReplaceAll]); Edit4.Text:=StringReplace(Edit4.Text,'mb','',[rfReplaceAll]); Edit5.Text:=StringReplace(Edit5.Text,'MB','',[rfReplaceAll]); Edit5.Text:=StringReplace(Edit5.Text,'mb','',[rfReplaceAll]); //koniec kodu a:=StrToFloat(Edit1.Text); b:=StrToFloat(Edit2.Text); c:=StrToFloat(Edit3.Text); d:=StrToFloat(Edit4.Text); e:=StrToFloat(Edit5.Text); w:=a+b+c+d+e; wynik.Text:=FloatToStrF(w, ffNumber, 0, 0);
No i wszystko git, tylko jeśli Edit4 i Edit5 nie ma nic w polu, to wyskoczy błąd:
'' is not a valid floating point value
No i teraz jak poprawić ten kod i ewentualnie zmniejszyć? :) Można by było sprawdzać if'em czy jest coś wpisane w Edit, ale to jest trochę mozolny sposób... Jest jakiś inny?
Proszę o pomoc.
Pozdrawiam



Wstaw do tych editow 0.


Można by było sprawdzać if'em czy jest coś wpisane w Edit, ale to jest trochę mozolny sposób... Jest jakiś inny?

Możesz np poszczególne składniki zapisać do tablicy - i konwertować je w pętli korzystając z try - except.
Krótszy zapis i pewniejsze działanie.

Poza tym w swoim kodzie możesz użyć tablicy Components - nie będziesz wtedy musiał dawać kodu osobno dla każdego Edita.


Wstaw do tych editow 0.
No właśnie nie chce wstawiać 0... Bo ja chcę na końcu, aby było puste pole. A trochę głupio jest najpierw przypisywać 0, następnie sprawdzać ifem czy było coś wpisane, jeśli tak to zostawić, a jeśli nie to skasować... Za dużo zabawy (bo tych editów mam dużo więcej :P).


Możesz np poszczególne składniki zapisać do tablicy - i konwertować je w pętli korzystając z try - except.
Krótszy zapis i pewniejsze działanie.

Poza tym w swoim kodzie możesz użyć tablicy Components - nie będziesz wtedy musiał dawać kodu osobno dla każdego Edita.

Czyli jak? Bo trochę nie rozumiem... (początkujący jestem :) ).

Dzięki za odpowiedzi ;)




No właśnie nie chce wstawiać 0... Bo ja chcę na końcu, aby było puste pole. A trochę głupio jest najpierw przypisywać 0, następnie sprawdzać ifem czy było coś wpisane, jeśli tak to zostawić, a jeśli nie to skasować... Za dużo zabawy (bo tych editów mam dużo więcej :P).
Czyli jak? Bo trochę nie rozumiem... (początkujący jestem :) ).

Dzięki za odpowiedzi ;)


Na mój rozum(Sorry że kod nie sprawdzony ale nie mam kompilatora) - tworzysz tablicę np tak:
var edits: array [1..5] of Component;
Potem:
TEdit(edits[1]).Text:='20MB'; TEdit(edits[2]).Text:='40'; TEdit(edits[3]).Text:='60mb'; TEdit(edits[4]).Text:=''; TEdit(edits[5]).Text:='';

A w funkcji głównej zamist wykonywać wszystkie elementy po kolei po Edit1, Edit2, wstawiasz pętlę for i każde zadanie zapisujesz tylko raz. Oszczędzi to duużo kodu ;)

var w: Single; i: Integer; begin //kod na wywalenie MB for i:=1 to 5 do begin edits[i]:=StringReplace(edits[i].Text,'MB','',[rfReplaceAll]); edits[i]:=StringReplace(edits[i].Text,'mb','',[rfReplaceAll]); end; //koniec kodu for i:=1 to 5 do begin w:=w+edits[i]; end; wynik.Text:=FloatToStrF(w, ffNumber, 0, 0);
Użytkownik Tomek92 edytował ten post 06 sierpień 2008, 13:39
Według mnie da się to zrobić prościej.
edit1.text := '0' + edit1.text;

i tak z wszystkimi editami. W ten sposób jeśli edit będzie pusty dodane zostanie 0, a jeśli nie to 0 na początku nic nie zmieni w obliczeniach


Według mnie da się to zrobić prościej.
edit1.text := '0' + edit1.text;

i tak z wszystkimi editami. W ten sposób jeśli edit będzie pusty dodane zostanie 0, a jeśli nie to 0 na początku nic nie zmieni w obliczeniach


napisal ze nie chce wstawiac 0 :)

dla integera i, stringa component_name, tablicy floatow tab bedzie to wygladalo tak:

for i:=1 to 5 do begin component_name:= 'Edit' + IntToStr(i); if TEdit( FindComponent( component_name )).Text <> '' then begin TEdit( FindComponent( component_name )).Text:=StringReplace(TEdit( FindComponent( component_name )).Text,'MB','',[rfReplaceAll]); TEdit( FindComponent( component_name )).Text:=StringReplace(TEdit( FindComponent( component_name )),'mb','',[rfReplaceAll]); tab[i]:=StrToFloat( TEdit( FindComponent( component_name )).Text); end else tab[i] := 0; end;

Pozniej wystarczy zsumowac zawartosc tablicy tab od 1 do 5 (oczywiscie zakres zmien do ilosci Editow ktora masz).

//wciecia sie posypaly, radze gdzies wkleic i dopiero czytac.
Użytkownik Deadeye edytował ten post 07 sierpień 2008, 01:06
Pisałem o wykorzystaniu tablicy Components - ale oczywiście równie dobrze można skorzystać z rozwiązania podanego przez deadeye'a czyli FindComponent.
Z tym, że zbędne jest (niepotrzebnie to zasugerowałem wcześniej) korzystanie z tablicy z wartościami editów. Z tego co zrozumiałem interesuje Cię wynik - więc wystarczy po prostu sumować zawartość poszczególnych editów, np coś w tym stylu:

for i:=1 to 5 do begin component_name:= 'Edit' + IntToStr(i); if FindComponent(component_name)<>nil then try w:=w+StrToFloat(StringReplace(UpperCase(TEdit(FindComponent(component_name) ).Text),'MB','',[rfReplaceAll])); except end; end;

W except możesz dać obsługę błędnych wpisów - np. jeśli edit jest pusty to nic nie robić - ale jeśli jest tam coś wpisane to wyświetlić komunikat o błędnym wpisie.
Nie wycinałem tu informacji o MB bo nie jest to konieczne do obliczenia sumy ale jeśli nie chcesz tej informacji to możesz sobie dodać wycinanie - tak jak to było pokazane wyżej.
Zresztą - pobaw się kodem i sam sobie dopracuj co Ci potrzeba :)

Wielkie dzięki za pomoc :) Teraz wszystko chodzi :)
Temat do zamknięcia... Jeszcze raz THX!

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •