Autor Beitrag
Markus696
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mi 12.03.14 09:28 
Hallo,

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


ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 101
Erhaltene Danke: 12

WIN XP, WIN 7, WIN 10
Delphi 6 Prof, Delphi 2005, FPC
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: Do 13.03.14 11:57 
also, ich würde deine 3 Methoden in einer zusammenfassen.

ausblenden volle Höhe 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.:
ausblenden 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

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
Markus696 Threadstarter
Hält's aus hier
Beiträge: 7



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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Di 18.03.14 17:37 
Du suchst Suche in der Delphi-Reference TRYSTRTOINT.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."