Czesc, mam problem ze sprawdzeniem kilkunastu editow czy nie sa puste.
if (Edit1.Text = '') and (Edit2.Text = '') then
dla 2 czy 3 mozna ifem, ale dla kilkunastu to juz sie robi nieladnie.
Jak takie rzeczy sie robi?
Czesc, mam problem ze sprawdzeniem kilkunastu editow czy nie sa puste.
if (Edit1.Text = '') and (Edit2.Text = '') then
dla 2 czy 3 mozna ifem, ale dla kilkunastu to juz sie robi nieladnie.
Jak takie rzeczy sie robi?
kilkasprawdzen czy edity nie sa puste
Musiż uszyć tablicyalbo RTTI. To pofinno pomodz.
czy tak procedura bedzie dobra, jesli na formie mam edity i maskedity i ich nazwy sa inne od edit1,edit2 itp?
procedure WyczyscPolaEdycyjne(Forma: TForm);
var
I: Integer;
begin
for I := 0 to Forma.ComponentCount - 1 do
begin
if (Forma.Components[I] is TEdit) or (Forma.Components[I] is TMaskEdit) then
begin
TEdit(Forma.Components[I]).Clear;
TMaskEdit(Forma.Components[I]).Clear;
end;
end;
end;
Po co rzutujesz jednocześnie na TEdit i na TMaskEdit obie te kontrolki wywodzą sie z TCustomEdit
Masz tutaj błąd(np rzutowanie TEdit na TMaskEdit). TEdit oraz TMaskEdit dziedziczą po TCustomEdit. jeżeli nie masz na formie innych komponentów dziedziczących po TCustomEdit to na niego rzutuj.
Równie dobrze możesz skorzystać z funkcji FindComponent
i w pętli znajdywać poszczególne kontrolki, jeśli ich identyfikatory na to pozwalają; Wtedy nie będziesz musiał sprawdzać ich klas a także przeszukiwać wszystkich kontrolek na danej formie;
Przykładowe użycie:
procedure WyczyscPolaEdycyjne(Forma: TForm);
var
I: Word;
begin
for I := 1 to 5 do
TCustomEdit(FindComponent('Edit' + IntToStr(I))).Clear();
end;
Pętla ustawiona jest od 1
do 5
, jeśli kontrolki edycyjne masz nazwane odpowiednio: Edit1
, Edit2
, Edit3
, Edit4
i Edit5
; Jeżeli będziesz miał ich więcej no to oczywiście musisz zmienić zakres indeksowania pętli;
Jeżeli masz tych pól więcej i ich identyfikatory nie są ponumerowane kolejno (np. jest Edit1
, Edit2
, trzeciego nie ma, Edit4
i Edit5
) musisz sprawdzić co zwraca funkcja FindComponent
;
Przykładowe użycie:
procedure WyczyscPolaEdycyjne(Forma: TForm);
var
Component: TComponent;
I: Byte;
begin
for I := 1 to 5 do
begin
Component := FindComponent('Edit' + IntToStr(I));
if Component <> nil then
TCustomEdit(Component).Clear();
end;
end;
zakres pozostaje bez zmian - wystarczy znać numer pierwszego i ostatniego komponentu;
dodaj do formy pole - tablicę editów, np.
edity:array[0..2] of TEdit;
potem np. w OnCreate wypełnij tę tablicę:
edity[0] := Edit1;
edity[1] := EditFoo;
edity[2] := EditBla;
Mysle, ze obejde sie bez tablic dodatkowych.
obecnie moja procedura wyglada tak i chyba tak pozsotanie (moze byc?)
procedure WyczyscPolaEdycyjne(Forma: TForm);
var
I: Integer;
begin
for I := 0 to Forma.ComponentCount - 1 do
begin
if (Forma.Components[I] is TCustomEdit) then
TCustomEdit(Forma.Components[I]).Clear;
end;
end;
Jeżeli możesz, łatwiej byłoby skorzystać z pętli foreach
.
for-in nie moge uzyć :) d7