![]() |
Mehreren RadioGroups eine Anweisung zuweisen
Hallo,
ich habe in einem TabSheet mehrere Radiogroups mit z.B. je 3 Items die angeklickt werden müssen, zum einem brauche ich das Ergebnis und Exceptions möchte ich vermeiden, wenn ich den Kram speichere. Deshalb ist der Button, mit dem ich weiter zu meinem nächsten Tabsheet klicke auf unsichtbar eingestellt bis alles angeklickt ist! Mein Code:
Delphi-Quellcode:
Da ich aber viele Radiogroups habe, ist mir das zu umständlich und zu viel unübersichtlicher Code!
procedure Radiogroup1
begin case Radiogroup1.itemindex of 0: begin button1.visible := true; end; 1: begin button1.visible := true; end; 2: begin button1.visible := true; end; end; end; nächste Radiogroup ... Gibt´s eine Möglichkeit, die Radiogroups innerhalb eines TabSheets zusammen zu fassen oder muss jede Komponete für sich behandelt werden? Hoffe, Ihr könnt mir helfen moperswings |
Re: Mehreren RadioGroups eine Anweisung zuweisen
Benutze schleifen, dass macht den Code schon mal kürzer.
Gruß oki |
Re: Mehreren RadioGroups eine Anweisung zuweisen
Ich bin mir nicht sicher, ob ich Dich richtig verstehe. Eine Möglichkeit wäre, einen einheitlichen EventHandler für alle RadioGroups einer TabPage festzulegen:
Delphi-Quellcode:
Das kann noch erweitert werden mit einer Regelung für das ganze PageControl:
procedure TabPage1_RadioGroupsClick(Sender: TObject)
begin button1.visible := (RadioGroup1.ItemIndex >= 0) and (RadioGroup2.ItemIndex >= 0) and (RadioGroup3.ItemIndex >= 0); end;
Delphi-Quellcode:
Wenn die Maßnahmen nicht klar sind, bitte in der Hilfe nachschlagen; danach kann ich es noch erläutern.
procedure PageControl_RadioGroupsClick(Sender: TObject)
var ActualPage: TTabSheet; i0: int; Result: bool; btnWeiter: TButton; begin ActualPage := (Sender as TPageControl).ActivePage; Result := false; btnWeiter := nil; // alle Controls der aktiven Seite durchgehen for i0 := 0 to ActualPage.Controls.Count - 1 do begin // wenn es sich um eine RadioGroup handelt, dann ItemIndex prüfen if ActualPage.Controls[i0] is TRadioGroup then Result := Result and ((ActivePage.Controls[i0] as TRadioGroup).ItemIndex >= 0) else begin if ActualPage.Controls[i0] is TButton then begin if (ActualPage.Controls[i0] as TButton).Caption = 'Weiter' then btnWeiter := ActualPage.Controls[i0] as TButton; end; end; end; // Ergebnis zuordnen btnWeiter.visible := Result; end; Viel Erfolg! Jürgen /Edit: Das zweite Verfahren habe ich mit der Prüfung des Buttons noch verbessert. Siehe die Erläuterungen in #5. PS. Ohne Gewähr - siehe meine Signatur. |
Re: Mehreren RadioGroups eine Anweisung zuweisen
Hallo Jürgen,
der erste Vorschlag hat den Nachteil, dass der Button angezeigt wird, nachdem ein Wert gleich in der ersten RadioGroup angeklickt wurde. Beim Zweiten gibt es zu viele Fehlermeldungen, mit denen ich im Moment nichts anfangen kann. Ich muss mal sehen, ob ich aus Deinen Vorschlägen was zusammenbauen kann. Danke für die Ideen und Grüsse, moperswings |
Re: Mehreren RadioGroups eine Anweisung zuweisen
Zitat:
Zitat:
/Edit: Beim zweiten Weg hatte ich vor allem eine Klammer vergessen. Erläuterungen zu diesem Verfahren:
Zusatzbemerkung 1: Diese Prozedur wurde jetzt so umfangreich, dass sie besser in eine eigene Prozedur ausgelagert werden sollte. Dann kann sie auch einfacher von verschiedenen TabSheets aus aufgerufen werden. Zusatzbemerkung 2: In solchen Fällen gefällt mir Button.Enabled besser als Button.Visible, weil der Anwender dann direkt sieht, dass sich noch etwas ändern kann. Viel Erfolg! Jürgen |
Re: Mehreren RadioGroups eine Anweisung zuweisen
Hallo,
hast Du den Code von dem ersten Teil ausprobiert? Bei mir wird der Button nicht angezeigt!! Am Button habe ich nur visible auf false gesetzt, in den RadioGroups stehen nur die Items drin. Müssen irgendwelche Ereignisse eingestellt werden? Könnte ich irgendetwas ganz triviales falsch gemacht oder eingestellt haben? Liegts an den Delphi-Versionen? Ich seh´s nicht! Edit/ Danke für die Tipps für den zweiten Teil. Den muss ich jetzt aber nochmal durcharbeiten! Vielen Dank und Grüsse, moperswings |
Re: Mehreren RadioGroups eine Anweisung zuweisen
Zitat:
Nein, ich habe nichts ausprobiert - siehe Signatur. Mein erster Vorschlag kann nicht falsch sein; allenfalls fallen mir Tippfehler bei der Übernahme des Codes ein, und es müssen alle RadioGroups aufgeführt werden. Aber Voraussetzung ist natürlich (Zusammenfassung früherer Hinweise):
|
Re: Mehreren RadioGroups eine Anweisung zuweisen
Ich hab´s!
1. Ich habe nicht alle RadioGroups mit einbezogen! 2. Ich habe nicht die Ereignisse gesetzt! 3. Ich konnte auch gar keine Ereignisse setzen, weil ich mir während des Ausprobierens meine Methoden gelöscht habe! Musste also kurz alles neu machen und dann hat´s geklappt! Deinen zweiten Vorschlag muss ich nochmal durcharbeiten, vor allem, weil es mich interessiert, wie man Aufgaben besser zusammen fassen kann. Vielen Vielen Dank für Deine Hilfe und Deine Mühen! moperswings |
Re: Mehreren RadioGroups eine Anweisung zuweisen
Hallo,
Zitat:
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:
Durch die Benutzung der Tag-Eigenschaften, muss man nicht mehr bei jedem RadioGroupClick alle Controls durchlaufen.
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; :arrow: 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:
:arrow:
//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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz