Inhaltsverzeichnis

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


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

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.



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



Start - FAQ - Glossar - Sitemap - Impressum