===== Auswahlfelder zum Anhaken (CheckBox) ===== ==== Einleitung ==== CheckBoxen dienen in der Regel zur Bereitstellung mehrerer Auswahlmöglichkeiten. Im Gegensatz zu den RadioButtons kommen sie jedoch meist zum Einsatz, wenn es darum geht, mehr als eine Möglichkeit gleichzeitig zu aktivieren / zu deaktivieren. Ein Beispiel für den Einsatz findet sich im StartCenter von [[https://www.cockpit-xp.de|Cockpit-XP]] im Reiter ''Optionen -> Chaos-Optionen''. Im oberen Bereich gibt es 4 Optionen mit CheckBoxen. Es ist möglich keine Möglichkeit, alle Optionen oder nur bestimmte Varianten zu aktivieren. Direkt darunter ist ein gutes Anschauungsobjekt für den RadioButton zu sehen. Hier gibt es nur entweder ''Direkte Bestrafung'' oder ''Bestrafung über Strafkatalog ...''. Die gleichzeitige Nutzung beider Optionen ist nicht möglich. {{ :cockpit-xp:addon:formulare:cp-wiki-tcheckbox-beispiel-1.png?nolink |}} \\ ==== Codebeispiel ==== Dieses Beispiel stammt aus dem AddOn ''SLX - Fastest Lap Trophy''. Es bietet nach einem unsauberen Ende und damit unpassenden Daten in der Datenbank die Möglichkeit, Daten des Teilnehmers zu löschen oder den ersten oder letzten Datensatz (bei mehr als 1 vorhandenen Durchgang) aus der Datenbank zu entfernen. Zugegeben, ein Beispiel, das genauso zu einem RadioButton passen würde. Ich habe mich hier allerdings für die CheckBox entschieden, weil ein einmal aktivierter RadioButton in diesem Zustand bleibt. Hier sollte allerdings die Möglichkeit bestehen bleiben, beide Optionen wieder zu deaktivieren und dann auch wieder die Schaltflächen im Wechselspiel zu aktivieren/deaktivieren. \\ var // Variablen für TForm frmDelete2 - Datensätze bereinigen frmDelete2 : TForm; btnBereinigen : TButton; btnNeustart2 : TButton; lblDelete2 : TLabel; cbDelFirst : TCheckBox; cbDelLast : TCheckBox; fine : Boolean; ... //---------------------------------------------------------------------- // Eingabeformular zur Entscheidung, welcher Subscreen // im Fall einer Mehrfachauswahl gezeigt werden soll procedure TeilnehmerDatenLoeschenForm2(); begin frmDelete2 := TForm.Create(nil); frmDelete2.Caption := 'SLX - Fastest Lap Trophy | Auswahlformular 2'; frmDelete2.BorderStyle := bsDialog; frmDelete2.BorderIcons := 0; frmDelete2.SetBounds(300, 250, 470, 320); lblDelete2 := TLabel.Create(frmDelete2); lblDelete2.Name := 'Label1'; lblDelete2.Parent := frmDelete2; lblDelete2.Caption := cpGetStringVar('lblDelete2Caption'); lblDelete2.Alignment := taCenter; lblDelete2.WordWrap := True; lblDelete2.Font.Name := 'Arial'; lblDelete2.Font.Size := -14; lblDelete2.SetBounds(30, 20, 410, 120); cbDelFirst := TCheckBox.Create(frmDelete2); cbDelFirst.Name := 'CheckBox1'; cbDelFirst.Parent := frmDelete2; cbDelFirst.Caption := 'Ersten Durchgang behalten'; cbDelFirst.State := cbUnchecked; cbDelFirst.Alignment := taRightJustify; cbDelFirst.Font.Name := 'Arial'; cbDelFirst.Font.Size := -18; cbDelFirst.SetBounds(90, 140, 330, 40); cbDelLast := TCheckBox.Create(frmDelete2); cbDelLast.Name := 'CheckBox2'; cbDelLast.Parent := frmDelete2; cbDelLast.Caption := 'Letzten Durchgang behalten'; cbDelLast.State := cbUnchecked; cbDelLast.Alignment := taRightJustify; cbDelLast.Font.Name := 'Arial'; cbDelLast.Font.Size := -18; cbDelLast.SetBounds(90, 175, 330, 40); btnBereinigen := TButton.Create(frmDelete2); btnBereinigen.Name := 'Button1'; btnBereinigen.Parent := frmDelete2; btnBereinigen.Caption := 'Bereinigen'; btnBereinigen.Enabled := False; btnBereinigen.Font.Name := 'Arial'; btnBereinigen.Font.Size := -18; btnBereinigen.SetBounds(30, 230, 170, 40); btnNeustart2 := TButton.Create(frmDelete2); btnNeustart2.Name := 'Button2'; btnNeustart2.Parent := frmDelete2; btnNeustart2.Caption := 'Neustart'; btnNeustart2.Enabled := True; btnNeustart2.Font.Name := 'Arial'; btnNeustart2.Font.Size := -18; btnNeustart2.SetBounds(260, 230, 170, 40); btnBereinigen.OnClick := @btnBereinigenClick; btnNeustart2.OnClick := @btnNeustart2Click; cbDelFirst.OnClick := @cbDelFirstClick; cbDelLast.OnClick := @cbDelLastClick; fine := False; // Formular geöffnet lassen, bis Fine wahr wird. cpShow(frmDelete2); // Formular anzeigen // Solange fine den Wert false hat, immer wieder kurz warten while not fine do begin cpSleep(50); // Kurz bevor der RBS geschlossen wird (Event BeforeClose), wird die // Variable CloseForm gesetzt und das Formular geschlossen, falls es // zu diesem Zeitpunkt noch geöffnet ist if cpGetIntegerVar('CloseForm') = 99 then begin fine := True; end; end; cpFormFree(frmDelete2); // Formular schließen end; // END procedure - TeilnehmerDatenLoeschenForm2 //---------------------------------------------------------------------- // Handler, wenn Button 'Bereiningen' geklickt wurde procedure btnBereinigenClick(Sender: TButton); begin // Formular zum Löschen aller - bis auf einen - Durchgänge cpSetIntegerVar('EinenDurchgangBehalten', 1); // Button gedrückt frmDelete2.ModalResult := mrOk; // Fine sorgt für das Schließen des Formulars fine := True; end; // END procedure - ButtonDeleteClick //---------------------------------------------------------------------- // Handler, wenn Button 'Neustart' geklickt wurde procedure btnNeustart2Click(Sender: TButton); begin // Fahrer behält einen Durchgang und ist dann fertig cpSetIntegerVar('EinenDurchgangBehalten', 0); // Button gedrückt frmDelete2.ModalResult := mrOk; // Fine sorgt für das Schließen des Formulars fine := True; end; // END procedure - ButtonCancelClick //---------------------------------------------------------------------- // Handler, wenn Button geklickt wurde procedure cbDelFirstClick(Sender: TCheckBox); begin if cpGetIntegerVar('cbDelFirstChecked') = 0 then begin cbDelFirst.State := cbChecked; cbDelLast.State := cbUnchecked; btnBereinigen.Enabled := True; btnNeustart2.Enabled := False; cpSetIntegerVar('ErstenDurchgangBehalten', 1); cpSetIntegerVar('cbDelFirstChecked', 1); cpSetIntegerVar('cbDelLastChecked', 0); end else begin cbDelFirst.State := cbUnchecked; if cpGetIntegerVar('cbDelLastChecked') = 0 then begin btnBereinigen.Enabled := False; btnNeustart2.Enabled := True; end; cpSetIntegerVar('ErstenDurchgangBehalten', 0); cpSetIntegerVar('cbDelFirstChecked', 0); end; end; //---------------------------------------------------------------------- // Handler, wenn Button geklickt wurde procedure cbDelLastClick(Sender: TCheckBox); begin if cpGetIntegerVar('cbDelLastChecked') = 0 then begin cbDelLast.State := cbChecked; cbDelFirst.State := cbUnchecked; btnBereinigen.Enabled := True; btnNeustart2.Enabled := False; cpSetIntegerVar('ErstenDurchgangBehalten', 0); cpSetIntegerVar('cbDelFirstChecked', 0); cpSetIntegerVar('cbDelLastChecked', 1); end else begin cbDelLast.State := cbUnchecked; if cpGetIntegerVar('cbDelFirstChecked') = 0 then begin btnBereinigen.Enabled := False; btnNeustart2.Enabled := True; end; cpSetIntegerVar('ErstenDurchgangBehalten', 1); cpSetIntegerVar('cbDelLastChecked', 0); end; end; //---------------------------------------------------------------------- // Ende TForm - TeilnehmerDatenLoeschenForm2 //---------------------------------------------------------------------- ... Erscheint das Formular auf dem Monitor, sieht es so aus {{ :cockpit-xp:addon:formulare:cp-wiki-tcheckbox-codebeispiel-1.png?nolink |}} Sollte der Teilnehmer neu an der Trophy teilnehmen wollen, werden alle bisherigen Ergebnisse mit einem Klick auf den Button ''Neustart'' aus der Datenbank gelöscht. Gibt es jedoch mehr als eine vollständige Session, hat er also mehr als einmal teilgenommen, bieten die beiden Optionen die Möglichkeit, einen der Durchgänge zu behalten. Diese beiden Optionen funktionieren im Wechsel. Es kann jeweils nur eine gewählt sein. Der Button ''Neustart'' wird inaktiv und die Schaltfläche ''Bereinigen'' ist jetzt scharf. \\ {{ :cockpit-xp:addon:formulare:cp-wiki-tcheckbox-codebeispiel-2.png?nolink |}}{{ :cockpit-xp:addon:formulare:cp-wiki-tcheckbox-codebeispiel-3.png?nolink |}} \\ Ein Klick auf ''Bereinigen'' entfernt alle übrigen Einträge dieses Anwenders aus der Datenbank und schließt den Rennbildschirm. Schließlich hat er damit erfolgreich teilgenommen und darf nicht erneut antreten. Die Bereinigungsfunktion findet auch Einzelfragmente einer Teilnahme, z.B. nur Runden auf Spur 1 (von n). Beim Bereinigen, werden auch diese Fragmente entfernt, ohne darauf näher einzugehen. Es geht ausschließlich um ein sauberes Ergebnis in der Datenbank. __**Hinweise**__ Eine gute Dokumentation findet der interessierte Entwickler im [[http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/StdCtrls_TCheckBox.html|Internet]]. Dort sind die Eigenschaften (Properties) vollständig und umfassend beschrieben. Properties sind die Teile hinter dem Objektnamen. Im Beispiel ist z.B. ''cbDelFirst'' das Objekt der ersten Checkbox und ''Caption'' die Eigenschaft - hier der Text nach dem Kontrollkästchen, in das der Haken platziert wird. Beide Elemente sind durch einen Punkt getrennt. \\ ---- [[cockpit-xp:start|Start]] - [[cockpit-xp:faq|FAQ]] - [[cockpit-xp:glossar|Glossar]] - [[cockpit-xp:sitemap|Sitemap]] - [[cockpit-xp:impressum|Impressum]]