Einzelnen Beitrag anzeigen

Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#9

Re: Mehreren RadioGroups eine Anweisung zuweisen

  Alt 9. Feb 2007, 14:24
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;
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat