![]() |
Checkbox mit erweiteren Eigenschaften gesucht
Schönen Abend allerseits.
Ich bin auf der Suche nach einer Komponente (Checkbox), die folgende Funktionaliät erfüllt: - Checkboxgröße möglichst anzupassen (nicht unbedingt erforderlich) - Mehrere Checkboxen müssen sich gegenseitig ausschliessen können, wie bei Radiobuttons. Ich kann diese Checkboxen allerdings nicht auf einer Groupbox plazieren (sonst könnte ich gleich die Radiobuttons nehmen), sondern ich müsste zur Designzeit oder zur Laufzeit der Checkbox sagen können, mit welchen anderen Checkboxen sie sich gegenseitig ausschliessen soll. Ziemlich verworren, deshalb nochmal in Kurzfassung: Gesucht wird eine Checkbox als Komponente, die sich wie Radionbuttons gegenseitig ausschliessen können allerding ohne diese dazu mit einer Groupbox zusammenzufassen. Ob Freeware, Shareware oder gegen Cash ist egal. Es wäre schön, wenn mir jemand helfen könnte. Schönen Abend noch Horst |
Re: Checkbox mit erweiteren Eigenschaften gesucht
Das klingt nach einem Designfehler. Wo man Radiobuttons braucht dort soll man auch Radiobuttons nehmen.
Gruppiert wird mit einer TRadioGroup. |
Re: Checkbox mit erweiteren Eigenschaften gesucht
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:
Das müßte funktionieren, kann es selber zur Zeit nicht testen.
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; 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] |
Re: Checkbox mit erweiteren Eigenschaften gesucht
Ich finde man hat auch die Verantwortung jemandem ein Problem nicht zu loesen wenn es erkennbar ein ungeeigneter Ansatz ist.
Das ist hier klar der Fall. Eine Checkbox als Radiobutton zu missbrauchen wird niemals ein verstaendliches und bedienbares Userinterface ergeben. Genaugenommen ist die urspruengliche Frage falsch. Sie sollte schildern welches User-Interface-Problem geloest werden soll. |
Re: Checkbox mit erweiteren Eigenschaften gesucht
Robert wollte nur darauf hinweisen, dass es besser für den Benutzer ist wenn er bekannte Objekte sieht, dass diese auch so funktionieren wie erwartet. Und ein Windows-Nutzer erwartet nun mal bei einer Checkbox, dass jede einzeln ausgewählt werden kann und bei Radiobuttons nur eine davon.
Delphi-Quellcode:
Dort sollte man entweder eine Variable nutzen in der die Checkbox gespeichert wird, oder with. Vier mal FindComponent ist nicht gerade performant ;)
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;
Delphi-Quellcode:
var
tmpCheckBox: TCheckBox; begin . . . tmpCheckBox:=TCheckbox(FindComponent(Refname+InttoStr(i))); If tmpCheckBox.Checked then Begin tmpCheckBox.onClick:=nil ;{Ereignisroutine abschalten} tmpCheckBox.Checke:=False;{sonst wird’s spassig} tmpCheckBox.onClick:=onclick Methode{wieder aktiv } End; |
Re: Checkbox mit erweiteren Eigenschaften gesucht
Tja, natürlich habt ihr recht, doch manchmal hilft es mehr, wenn auch ein bißchen Code rüberkommt. Die Aussage ob Radiobutton oder nicht war bereits geklärt und mit meinem Codeschnipsel wollt ich zeigen, es geht manchmal mehr, wenn man um die Ecke denkt. Die Lösung mit dem globalen String in einer Ereignisroutine ist auch nicht grad erste Sahne und geht vielleicht wesentlich besser über irgendein abgeleitetes Objekt. Aber ich fand diese Lösung verständlich und durchaus funktionell. In einem Punkt geb ich euch recht: die Aufgabenstellung war wenn überhaupt schwer zu erkennen. Ein klares Wort ergibt sicherlich auch klare Ergebnisse.
Zum Schluß: Was ist daran falsch, eine Aufgabe jemandem zu lösen und vielleicht auch mit Code zu helfen. Ich bin doch hier richtig im Forum Delphi Praxis. Da hatte ich erwartet, auch mal ein wenig Code rüber zu reichen. Und wenn's denn besser geht, ich laß mich gern belehren. Wie z. B. das mit der Variablen. Hab ich auch wieder etwas dazugelernt... Nich, das ich's nicht gewußt hätte, aber draufgekommen bin ich halt nicht. :oops: |
Re: Checkbox mit erweiteren Eigenschaften gesucht
Zitat:
![]() P.S: Herzlich willkommen in der Delphi-Praxis :party: |
Re: Checkbox mit erweiteren Eigenschaften gesucht
Grundsätzlich empfehle ich mal einen eingehenden Blick auf die 'Interface Hall Of Shame' eine ursprünglich von iArchitects gepflegte Seite, die mittlerweile dort nicht mehr aufzufinden ist. Stattdessen hat sich ein deutscher Gralshüter gefunden, und zwar
![]() Es gibt Checkboxen/Radiobuttons, denen kann man Bitmaps unterjubeln: Eins für jeden Zustand. Damit lassen sich dann beliebig große CheckBoxen darstellen. Ich weiss nicht, ob die Jedi-Komponenten das können, aber einen Blick sind die allemal wert. Ich verwende Komponenten von ![]() Alternativ dazu würde ich eventuell versuchen, ob man mit Toolbuttons nicht auch zum Ziel kommt. Die kann man gruppieren und dafür sorgen, das immer nur ein Button gedrückt ist. Da Toolbuttons auch Zustände anzeigen können, ohne gleich eine Aktion auszulösen (was ja sonst die Eigenschaft eines Buttonis ist), finde ich das legitim. Natürlich sind es ein bisserl blöd aus, wenn mitten im Formular irgendwo Toolbuttons rumfleuchen. Im Endeffekt sind Radiobuttons wirklich das Richtige, wenn man sich gegenseitig ausschließende Optionen auswählen will. |
Re: Checkbox mit erweiteren Eigenschaften gesucht
Hallo zusammen,
danke für die zahlreichen Denkanstösse, insbesondere von Oldmax. Ich denke, das bringt mich auf die richtige Spur. Robert hat mit seiner Bemerkung sicher recht, aber dieser Fall liegt doch etwas anders. Der Hintergrund ist, dass ich PDF-Formulare als Windows-Form darstellen und funktionell nachstellen muss. Dazu müssen die entsprechenden Eingabefelder und Checkboxen entsprechend dynamisch erzeugt und positioniert werden. Speziell bei den sich ausschließenden Checkboxen sind diese aber häufig nicht über eine Groupbox zusammenzufassen, so dass ich einen anderen Weg finden muss. Schönen Tag noch Horst |
Re: Checkbox mit erweiteren Eigenschaften gesucht
Zitat:
Ich habe mir zu diesem Zweck eine Komponente geschrieben, die wie eine RadioGroup reagiert, allerdings Checkboxen statt RadioButtons besitzt. Und bis jetzt hat sich noch KEIN Benutzer beschwert. Die fanden das sogar hilfreich (eben WEIL RadioButtons nicht deaktivierbar sind). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:52 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