Hi
Zuerst, ich bin neu hier, also, haut mich, wenn ich gegen unbekannte Regeln verstoße.. aber haut mich nicht um.
So, nun kommt auch gleich eine Antwort.
Robert, deine ist nicht hilfreich. Wenn ich ein Problem habe, zu dem es keine fertigen Elemente gibt, muß ich einen Weg finden, dieses Problem zu lösen. Das nenn ich programmieren. Ich hoffe, dir nicht auf den Fuß getreten zu haben, klar, dass man die Lösung zuerst mit den gegebenen Elementen versucht, aber oft genug geht's eben nicht und da ist Hilfe erbeten, wenn man's nich selber hinkriegt.
Außerdem gibt es hier viele Leser, die den ein oder anderen Lösungsansatz auch brauchen und deshalb ist meine Antwort auch etwas ausführlich.
Also, ich würd folgende Lösung vorschlagen:
Da ich nicht weiß (du vielleicht auch nicht ) wieviel Checkboxen da nun in deiner Form verteilt sind, muß ich einen Parameter haben, der etwas über den Namen der Checkbox weiß und ob er zu einer Gruppe gehört. Auf Anhieb fällt mir da erst mal ein String ein, der nun variabel lang sein kann. Eintragen kann ich alles mögliche und so ergibt sich doch eine ausreichende Beschreibung der Checkboxen. Wie, ganz einfach:
Dem Zeichen an der xten Stelle gebe ich eine Beziehung zur Checkbox. Kompliziert? Wenn man’s verstanden hat nicht.
Sagen wir, der String hat folgenden Inhalt: Cb_Para:=‚0012213311TT00TZZZT2‘
Dieser String kann 20 Checkboxen in Gruppen fassen. Definieren wir Gruppe „0“ als unabhängig und die anderen als abhängig.
Kommen wir zur Namensverteilung der Checkboxen. Damit wir indiziert auf diese zugreifen können, sollten sie im Namen irgendwo leicht erkenbar eine Zahl haben z. B. ...Name:=‘Checkbox_1‘ und diese Zahl muß zu einer Zeichenposition im String passen.
Warum nun einen Unterstrich? Nun, über die Zuweisung xPos:=Pos(‚_‘,Name) und anschließendem Index:=Copy(Name,xPos+1,Length(Name)-xPos) bekomme ich den Zeiger auf das Zeichen im String.
Und so kann dann die gemeinsame onClick Methode aussehen:
Delphi-Quellcode:
Lokale Variable: i : Integer;
XPos :Integer;
RefName: String:
RefIndex: Integer;
RefPara
Begin
If Checked then {nur ausführen, wenn gesetzt}
begin
XPos:=Pos(‚_‘,Name)
RefName:=Copy(Name,1,xPos); {Name des Senders ohne Zahlenanteil)
RefIndex:=StrToInt(Copy(Name,xPos+1,Length(Name)-xPos)); {eigenen Parameter holen}
If cb_Para[RefIndex]<>‘0‘then
Begin {Checkbox gehört einer Gruppe an }
For i:=1 to Length(cb_Para) do
Begin
If i<> RefIndex do { den soeben betätigten ausschließen}
Begin
If TCheckbox(FindComponent(Refname+InttoStr(i))).Checked then
Begin
TCheckbox(FindComponent(Refname+InttoStr(i))).onClick:=nil ;{Ereignisroutine abschalten}
TCheckbox(FindComponent(Refname+InttoStr(i))).Checke:=False;{sonst wird’s spassig}
TCheckbox(FindComponent(Refname+InttoStr(i))).onClick:=onclick Methode{wieder aktiv }
End;
End;
End
End;
End;
Das müßte funktionieren, kann es selber zur Zeit nicht testen.
Wenn es um verschiedene Größen geht, dann bastel doch über TPanel- Objekte ein Button in beliebiger Größe und nimm statt Checked Eigenschaft eine Farbe. Grün und Rot z. B.
Aufbau ist ähnlich.
Sinn diese Übung ist eigentlich die Flexibilität zur Laufzeit. Und selbst wenn Checkboxobjekte zur Laufzeit generiert werden, ist diese Routine leicht anzupassen.
Daher meine obige Bemerkung, das du vielleicht selber die Anzahl der Checkboxen nicht kennst. So, nun viel Spaß damit, vielleicht hat‘ s gehelft.....
[edit=Sharky]Delphi-Tags gesetzt. Mfg, Sharky[/edit]
Noch ist mein Rechner mir zu Diensten.... ansonsten habe ich die Macht ihn zu vernichten !