Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Checkbox soll Editfeld deaktivieren und wieder aktivieren


theevilworm - Sa 24.10.09 22:17
Titel: Checkbox soll Editfeld deaktivieren und wieder aktivieren
Hallo,

bin gerade auf dieses Problem gestoßen und weiß nicht, wie ich es umgehen kann:
Ich habe ein Editfeld und daneben eine Checkbox. Wenn ich bei der Checkbox einen Haken setze, soll das Editfeld deaktiviert werden, wenn ich den Haken wieder raus nehme, soll es wieder aktiviert werden.

Leichter gesagt als getan, da ich kein Ereignis im Objektinspektor gefunden habe, was explizit zwischen "Haken rein" und "Haken raus" unterscheidet, habe ich es folgendermaßen versucht:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
If Checkbox1.Checked=true Then
  begin
    edit2.Enabled:=false;
  end;
If checkbox1.Checked=false then
  begin
    edit1.enabled:=true;
  end;
end;


Wenn ich nun den Haken setze, wird Edit1 auch deaktiviert, wenn ich ihn wieder rausnehme, aber nicht wieder aktiviert. Wieso bloß?


Xentar - Sa 24.10.09 22:32


Delphi-Quelltext
1:
Edit1.Enabled := CheckBox1.Checked;                    

Fertig.
du brauchst übrigens nicht alles zu highlighten ;)

Nebenbei: Niemals auf =True oder =False abfragen. Lieber: If MyBoolean then .. oder If not MyBoolean then..


theevilworm - Sa 24.10.09 22:36

Dankeschön :)

Hoffentlich geh ich euch noch nicht auf den Sack nach meinen 2 Tagen hier :D

Zitat:


Nebenbei: Niemals auf =True oder =False abfragen. Lieber: If MyBoolean then .. oder If not MyBoolean then..


Wie du sicherlich bemerkt hast, bin ich noch ziemlicher Anfänger in Delphi, ich habe das mit den eigenen Booleans noch nicht verstanden. Daher diese umständliche Abfragerei von Eigenschaften.
Hast du in diesem Fall einfach "CheckBox1.Checked=true" unter MyBoolean vereint? Irgendwie habe ich in diesem Bereich ein Brett vorm Kopf :(

Edit:
Dein Vorschlag funktioniert bei mir gar nicht :(
Diese Zeile muss doch in die Prozedure Checkbox1Click, oder? Bei mir passiert da nix.


Xentar - Sa 24.10.09 22:43

Jo, genau. Bei deinem Quellcode wäre es

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  If Checkbox1.Checked Then
  begin
    edit2.Enabled:=false;
  end;
  If not checkbox1.Checked then
  begin
    edit1.enabled:=true;
  end;
end;


Ich hab nur leider gerade nicht die Erklärung zur Hand, warum das so ist.
Unter Delphi selber ist das erstmal nicht schlimm, aber spätestens, wenn du z.B. diverse Funktionen aus der Windows API verwendest, kann es hier zu Problemen kommen. Die genaue Erklärung kann vllt. jemand anderes noch per Link nachreichen? :) (Damn.. sollte mir solche auch mal sammeln ;) )


theevilworm - Sa 24.10.09 23:05


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  If Checkbox1.Checked Then
  begin
    edit2.Enabled:=false;
  end;
  If not checkbox1.Checked then
  begin
    edit1.enabled:=true;
  end;
end;


Der Code funktioniert aber gar nicht! *g*


Jann1k - Sa 24.10.09 23:33


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  If Checkbox1.Checked Then
  begin
    edit2.Enabled:=false;
  end;
  If not checkbox1.Checked then
  begin
    edit1.enabled:=true;
  end;
end;


Siehe Highlight im Code.


Lannes - Sa 24.10.09 23:33

Hallo,

was heist den "gar nicht"? keine Reaktion, falsche Reaktion, Compiler-Fehlermeldung ...


wenn das Dein Original-Code ist

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  If Checkbox1.Checked Then
  begin
    edit2.Enabled:=false;
  end;
  If not checkbox1.Checked then
  begin
    edit1.enabled:=true;
  end;
end;

Du veränderst die Eigenschaft unterschiedlicher Edits :wink:


Xentar - Sa 24.10.09 23:43

Doh, das hätte mir auch auffallen müssen :(


theevilworm - So 25.10.09 00:06

Ach, macht doch nichts :)

Ich stell mich ja auch doof an, hiermit zum Beispiel:
Ich habe zwei Checkboxen, nur eine von beiden kann zur Zeit aktiviert sein.
Muss ich das in diesem Fall genauso machen, mit If-Anweisungen? Warum klappt das nicht einfach so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
checkbox1.Checked:=true;
checkbox2.Checked:=false;
end;

procedure TForm1.CheckBox2Click(Sender: TObject);
begin
checkbox2.Checked:=true;
checkbox1.Checked:=false;
end;

end.


Das produziert mir einen Overflow :(


Xentar - So 25.10.09 00:18

1. Neue Frage = neues Thema
2. Für sowas gibt es RadioButtons.


Jann1k - So 25.10.09 00:20

Scheint wohl so, als würden sich die beiden checkboxen gegenseitig immer wieder aufrufen, praktisch also wieder eine Endlosschleife.

Könntest du statt der beiden Checkboxen eine TRadiogroup benutzen? Bei einer TRadiogroup kann nämlich immer nur eine Option ausgewählt werden und damit liefert sie denke ich genau das was du brauchst.


jaenicke - So 25.10.09 12:37

user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
Ich hab nur leider gerade nicht die Erklärung zur Hand, warum das so ist.
Unter Delphi selber ist das erstmal nicht schlimm, aber spätestens, wenn du z.B. diverse Funktionen aus der Windows API verwendest, kann es hier zu Problemen kommen. Die genaue Erklärung kann vllt. jemand anderes noch per Link nachreichen? :) (Damn.. sollte mir solche auch mal sammeln ;) )
Kein Problem, wofür gibts Entwürfe. :mrgreen:

Der Vergleich mit Booleanwerten (z.B. if x = true then) ist nicht nur unlogisch, sondern falsch.
Hier habe ich mal ein kleines Beispiel gebastelt, wann es schief geht:
http://www.delphi-forum.de/viewtopic.php?p=548760#548760
Mehr dazu steht hier unter Anfängerfehler:
http://www.delphi-treff.de/tutorials/objectpascal/programmierung-mit-boolean-werten/page/4/
Und warum das auch vollkommen unlogisch ist:
http://www.delphi-forum.de/viewtopic.php?p=560637#560637