Hallo,
Zitat von
moperswings:
...
weil es mich interessiert, wie man Aufgaben besser zusammen fassen kann
...
Eine ähnliche Variante, etwas kürzer:
Die Tag-Eigenschaft der Tabsheets wurde im
OI auf die Anzahl der RadioGroups gesetzt. MyRadioGroupClick ist allen RadioGroups auf den betreffenden Tabsheets zugewiesen. Solange Tabsheet.Tag noch > 0 ist wird runtergezählt, ist 0 erreicht wird der Button aktiviert.
Delphi-Quellcode:
procedure TForm1.MyRadioGroupClick(Sender: TObject);
var z : Integer;
begin
with TRadioGroup(Sender) do
if Tag = 0 then//damit nicht doppelt gezählt wird
begin
Tag := 1;
with Parent do //= TabSheetX oder PanelX oder Form ...
if Tag > 0 then //ab hier TabSheetX.Tag
begin
Tag := Tag-1;
if Tag = 0 then
for z := 0 to ControlCount - 1 do
if Controls[z] is TButton then
if (TButton(Controls[z]).Caption = '&Weiter') or
(TButton(Controls[z]).Caption = '&Fertigstellen') then
TButton(Controls[z]).Enabled:= True;
end;
end;
end;
Durch die Benutzung der Tag-Eigenschaften, muss man nicht mehr bei jedem RadioGroupClick alle Controls durchlaufen.
Den Code kann man noch weiter verbessern, indem man den Kern-Code auslagert(wie schon von
Jürgen Thomas erwähnt) und auch andere Controls in eine Überprüfung mit einschließt.
Im Beispiel wird sichergestellt das CheckListBoxen mindestens ein Item gecheckt haben, bevor der Button aktiviert wird.
Delphi-Quellcode:
//Parent.Tag = Anzahl Radiogoups und ChecklistBoxen
procedure TForm1.CheckActivate(aWinControl: TWinControl;blOptionOk: Boolean);
var z : Integer;
begin
with aWinControl do //aWinControl = TabSheetX oder PanelX oder Form ...
begin
if blOptionOk then
Tag := Tag-1
else
Tag := Tag+1;
if (Tag = 0) or (not blOptionOk) then
for z := 0 to ControlCount - 1 do
if Controls[z] is TButton then
if (TButton(Controls[z]).Caption = '&Weiter') or
(TButton(Controls[z]).Caption = '&Fertigstellen') then
TButton(Controls[z]).Enabled:= Tag = 0;
end;
end;
procedure TForm1.MyRadioGroupClick(Sender: TObject);
var z : Integer;
begin
with TRadioGroup(Sender) do
if Tag = 0 then//damit nicht doppelt gezählt wird
begin
Tag := 1;
CheckActivate(Parent,True);//TRadioGroup(Sender).Parent
end;
end;
procedure TForm1.MyCheckListBoxClickCheck(Sender: TObject);
var bl : Boolean;
begin
with TCheckListBox(Sender) do
if Checked[ItemIndex] then
begin
Tag := Tag + 1;
if Tag = 1 then//mindestens ein Item gechecked
CheckActivate(Parent,True);//TCheckListBox(Sender).Parent
end
else
begin
Tag := Tag - 1;
if Tag = 0 then
CheckActivate(Parent,False);
end;
end;
Wen man dann noch sicherstellt das der Button in Controls[x] den Index 0 hat,
dann kann man auch auf die Schleife zur Suche des Buttons verzichten.
Dann noch ein Hilfs-Array und einige Operationen mit Boolean, dann sieht das Ergebnis so aus:
Delphi-Quellcode:
const blArr : Array [Boolean] of ShortInt = (1,-1);
//...
//Parent.Tag = Anzahl Radiogoups und ChecklistBoxen
procedure CheckActivate(aWinControl: TWinControl;blOptionOk: Boolean);
begin
with aWinControl do //= TabSheetX oder PanelX oder Form ...
begin
Tag := Tag + blArr[blOptionOk];// +1 oder -1
if (Tag = 0) or (not blOptionOk) then
TButton(Controls[0]).Enabled := Tag = 0;
end;
end;
procedure TForm1.MyRadioGroupClick(Sender: TObject);
begin
with TRadioGroup(Sender) do
if Tag = 0 then//damit nicht doppelt gezählt wird
begin
Tag := 1;
CheckActivate(Parent,True);//TRadioGroup(Sender).Parent
end;
end;
procedure TForm1.MyCheckListBoxClickCheck(Sender: TObject);
begin
with TCheckListBox(Sender) do
begin
Tag := Tag + blArr[not Checked[ItemIndex]];//+1 oder -1
if Tag <= 1 then//bei 1 oder 0 reagieren
CheckActivate(Parent,Tag = 1);
end;
end;