Entwickler-Ecke

LCL-Komponenten - Lazarus - TCheckBox


Markus696 - Mi 12.03.14 09:28
Titel: Lazarus - TCheckBox
Hallo,

ich hätte eine grundlegende Frage zu der Lazarus-Komponente TCheckBox. Ich habe die Change-Ereignisse dreier Boxen folgendermaßen festgelegt:



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
procedure TMulticaesar.cb_ownstringChange( Sender: TObject );
begin

//  cb_ownstring.checked    := true ;

  cb_randomstring.checked := false ;
  cb_setstring.checked    := false ;

  e_setkey.enabled        := true ;

  e_setlengthkey.text     := 'Länge hier eingeben!' ;
  e_setlengthkey.enabled  := false ;


end;

procedure TMulticaesar.cb_setstringChange( Sender: TObject );
begin

//  cb_setstring.checked    := true ;

  cb_ownstring.checked    := false ;
  cb_randomstring.checked := false ;

  e_setlengthkey.enabled  := true ;

  e_setkey.text           := 'Schlüssel hier eingeben!' ;
  e_setkey.enabled        := false ;

end;

procedure TMulticaesar.cb_randomstringChange( Sender: TObject );
begin

//  cb_randomstring.checked := true ;

  cb_ownstring.checked    := false ;
  cb_setstring.checked    := false ;

  e_setkey.text           := 'Schlüssel hier eingeben!' ;
  e_setkey.enabled        := false ;

  e_setlengthkey.text     := 'Länge hier eingeben!' ;
  e_setlengthkey.enabled  := false ;

end;


Ich möchte einfach erreichen, dass die anderen beiden Checkboxes gecleart werden, wenn eine andere selektiert wird, da nur eine gleichzeitig aktiv sein darf. Bloß leider passiert Folgendes: Wenn ich zuerst eine Checkbox abhake, und danach eine andere wähle, dann wird erstere zwar gecleart, aber die zweite Box wird nur bei nochmaligem Klicken abgehakt, bleibt also anfangs noch leer. Ich habe probiert einfach noch das "Checked"-Attribut in der Prozedur zu ändern (siehe Kommentar am Prozeduranfang), aber das führt zu einer Fehlermeldung. Wäre super, wenn mir jemand mit entsprechender Komponentenkenntnis helfen könnte.

Moderiert von user profile iconMartok: Code- durch Delphi-Tags ersetzt
Moderiert von user profile iconChristian S.: Topic aus Sonstiges (Delphi) verschoben am Mi 26.03.2014 um 09:11


WasWeißDennIch - Mi 12.03.14 09:46

In meinen Augen machst Du es Dir unnötig kompliziert. Nimm doch statt 3 Checkboxen einfach eine RadioGroup, da kann nur maximal 1 Eintrag gleichzeitig aktiv sein.


icho2099 - Do 13.03.14 08:23

Es soll wohl auch möglich sein, dass keine der 3 Checkboxen angehakt ist?
Da würde ich im Change auf checked reagieren, und nicht generell.


zuma - Do 13.03.14 11:57

also, ich würde deine 3 Methoden in einer zusammenfassen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
function CheckboxenEinstellen(xCheckBoxNr : integer; xChecked : boolean);
begin
  try
    cb_randomstring.onchange := Nil;
    cb_ownstring.onchange := Nil;
    cb_setstring.onchange := Nil
   
    cb_randomstring.checked := False;
    cb_ownstring.checked    := False;
    cb_setstring.checked    := False; 
    
    case xCheckBoxNr of
      1begin
           cb_ randomString.Checked := xChecked;
           // zugehörige Editfelder einstellen 
         end;
      2begin
           cb_OwnString.Checked      := xChecked;
           // zugehörige Editfelder einstellen 
         end;
      3begin
           cb_SetString.Checked     := xChecked;  
           // zugehörige Editfelder einstellen 
         end;
    else
      // Meldung
      Showmessage('Ungültige CheckboxNr übergeben');
      // oder Behandlung des Fehlers (z.b. Defaultwerte setzen o.ä.)
    end;
  finally
    cb_randomstring.OnChange := cb_RandomsttringOnChange;
    cb_ownstring.OnChange := cb_ownstringOnChange;
    cb_setstring.OnChange := cb_setstringOnChange;
  end;
end;


in jedes Onchange dann einfach nur dir procedure mit den entsprechenden Parametern aufrufen
Bsp.:

Delphi-Quelltext
1:
CheckboxenEinstellen(1, cb_randomString.Checked);                    


durch das abhängen des OnChangeereignisses kannst du an den Checkboxen fummeln,
ohne dabei die jeweils anderen auszulösen (Checked := irgendwas löst wieder onchange aus).

Weiterer Vortei: Dein Code wird übersichtlicher/einfacher, weil die Checkboxauswertung nur an einer
und nicht 3 stellen passiert.

Ich hoffe, mein Ansatz hilft dir weiter

Zuma


Markus696 - Di 18.03.14 16:17

Danke, das wäre dann vom Tisch. :) Bei mir ist leider noch ein weiteres Problem aufgetaucht:


Delphi-Quelltext
1:
2:
3:
4:
5:
            try
              length := StrtoInt( e_setlengthkey.text ) ;
            except
              ShowMessage( 'ERROR. Falsche Parameter aufgerufen. Bitte eine Zahl eingeben!' );
            end;


Immer wenn ich das Programm mit beispielsweise einem String in e_setlengthkey laufen lasse kommt trotzdem eine Fehlermeldung in der Zeiler mit der length-Zuweisung. Kann mir jemand sagen, was ich hier falsch geschrieben habe?

Moderiert von user profile iconMartok: Code- durch Delphi-Tags ersetzt


WasWeißDennIch - Di 18.03.14 16:37

Kommt die Meldung nur innerhalb der IDE oder auch dann, wenn Du es außerhalb von Delphi/Lazarus laufen lässt? Im ersten Fall wäre das völlig normal.


Martok - Di 18.03.14 17:37

Du suchst Suche in der Delphi-Reference TRYSTRTOINT.