Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Checkbox mit erweiteren Eigenschaften gesucht (https://www.delphipraxis.net/68320-checkbox-mit-erweiteren-eigenschaften-gesucht.html)

hkoestner 27. Apr 2006 22:08


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

Robert Marquardt 28. Apr 2006 08:16

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.

oldmax 28. Apr 2006 08:26

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:
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]

Robert Marquardt 28. Apr 2006 09:18

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.

jim_raynor 28. Apr 2006 09:26

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:
        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;
Dort sollte man entweder eine Variable nutzen in der die Checkbox gespeichert wird, oder with. Vier mal FindComponent ist nicht gerade performant ;)

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;

oldmax 28. Apr 2006 10:34

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:

jim_raynor 28. Apr 2006 10:55

Re: Checkbox mit erweiteren Eigenschaften gesucht
 
Zitat:

Zitat von oldmax
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:

Es ist garnichts falsch daran und genau die richtige Einstellung :thumb: Und wenn du etwas zu sagen hast, dann sag es :wink: Solange es nicht gegen den Verhaltenskodex verstößt wird dich zumindestens hier in der Delphi-PRAXiS niemand umhauen. Aus dem gleichen Grund ist es aber nur fair, jemanden auf eventuell grundsätzliche Fehler hinzuweisen. Und so ganz klar wurde es durch den Beitrag nicht, warum er denn nun unbedingt die Checkboxen nutzen wollte ;).

P.S: Herzlich willkommen in der Delphi-Praxis :party:

alzaimar 28. Apr 2006 10:58

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 hier.

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 www.DevExpress.Com, da geht das ohne Probleme...

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.

hkoestner 28. Apr 2006 11:35

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

DevilsCamp 28. Apr 2006 12:42

Re: Checkbox mit erweiteren Eigenschaften gesucht
 
Zitat:

Zitat von Robert Marquardt
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.

Es kommt aber immer darauf an, was genau damit bezweckt wird. Ich hatte z.B. mal einen Fall, da brauchte ich genau das auch. Hintergrund: Der Benutzer hatte die Wahl zwischen EINER Auswahl oder KEINER. Da liegen nun mal die Vorteile der Checkboxen gegenüber Radiobuttons. Versuch da mal per Mausklick den Itemindex auf -1 zu bringen (zumal das OnClick-Ereignis bei einer RadioGroup nur dann ausgelöst wird, wenn man ein anderes als das aktuell ausgwählte Item anklickt).
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 11:54 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz