![]() |
Checkboxen machen mich wahnsinnig!
Liste der Anhänge anzeigen (Anzahl: 1)
Servus und Hallo!
Schon wieder ein Problemchen *seufz*. Wie erkläre ich es am besten ... nun... Ich habe ein Fenster mit 16 Checkboxen und TEdit-Feldern. Beim Start des Programmes ist in diesem Fenster nur die erste(!) Checkbox markiert bzw. gewählt (checked). Die erste Checkbox ist grundsätzlich checked UND disabled. (enabled := false). Alle anderen CheckBoxen (2 - 16) sind per Default nicht checked aber alle enabled. Wenn ich nun z.b. auf die 10te CheckBox klicke - so soll diese Checked sein UND gleichzeitig auch Enabled. (Geht.) Und: Von der zweiten bis zur neunten Checkbox soll jeweils Enabled := False UND gleichzeitig checked gesetzt sein. (Geht ebenfalls). Nun aber zum Problem. Wenn ich jetzt WIEDER auf diese 10te Checkbox klicke, soll das Häkchen weggehen (tut es ja auch so oder so) aber gleichezeitig sollen alle bis dahin marktierten Checkboxen (2 - 9) wieder "Enabled := True" und "Checked := False" sein - und genau da haut es nicht hin und ich weiss nicht wieso ... Ich habe es mit einem Array of TCheckBox versucht und mit folgendem:
Delphi-Quellcode:
In die jeweiligen CheckBoxen habe ich der Reihenfolge nach korrekte Tag-Werte geschrieben, eben einfach 1 bis 16...
If (Sender is TCheckBox) then
begin begin if VeloLayers = (Sender as TCheckBox).Tag then begin For i:=1 to VeloLayers-1 do begin BoxToCheck[i].Enabled := True; BoxToCheck[i].Checked := False; end end else begin For i:=1 to ((Sender as TCheckBox).Tag-1) do begin BoxToCheck[i].Enabled := False; BoxToCheck[i].Checked := True; end; VeloLayers := (Sender as TCheckBox).Tag; end; end; end; end; Ich weiss einfach nicht, wieso er dann nur zum TEIL die Checkboxen wieder auf "NICHT checked" setzt. Das sieht fast so aus als würde er immer Zweiersprünge machen. Das ist zum Haareraufen! :wall: :gruebel: |
Re: Checkboxen machen mich wahnsinnig!
Checkboxen sin dafür da, mehrere Optionen GLEICHZEITG auszuwählen.
Radiobuttons sind dafür da, nur EINE Option AUS MEHREREN auszuwählen. Wenn du da jetzt rummurkst, machst dur dir erstens einen Haufen Arbeit und baust zweitens einen Designfehler ein. EDIT: Ich sehe, du strebst was anderes an... lass mich mal drüber nachdenken. :gruebel: |
Re: Checkboxen machen mich wahnsinnig!
Hab grade versucht das Problem zu lösen aber genau wie du sagst ist das Problem das sobald man Checked ändert wird die OnClick Procedure ausgeführt -.-^^
Bin grad ne Lösung am suchen... EDIT: Probiers ma ungefähr so:
Delphi-Quellcode:
Ich glaube das ist nicht 100% das was du willst aber es beantwortet deine Frage :)
var
Form1: TForm1; Checks: Array[0..9] of TCheckbox; a: Boolean = false; //* implementation {$R *.dfm} procedure TForm1.CheckBoxenClick(Sender: TObject); var i: Integer; begin if not a then begin //* a:= true; //* for i:= TCheckBox(Sender).Tag to 9 do begin Checks[i].Enabled := true; Checks[i].Checked := false; end; for i:= TCheckBox(Sender).Tag-1 downto 0 do begin Checks[i].Enabled := false; Checks[i].Checked := true; end; TCheckBox(Sender).Checked := true; a := false; // * end; //*) Verhindert das OnClick nochmals während dem OnClick ausgeführt wird end; procedure TForm1.FormCreate(Sender: TObject); var i: Integer; begin for i:= 0 to 9 do begin Checks[i] := TCheckBox.Create(Self); Checks[i].Parent := Self; Checks[i].Left := 10; Checks[i].Top := i*20; Checks[i].Caption := 'Checkbox' + IntToStr(i); Checks[i].OnClick := CheckBoxenClick; Checks[i].Tag := i; end; end; Gruß Neutral General |
Re: Checkboxen machen mich wahnsinnig!
also ich würde einfach ein value-edit machen, und da dann eben "anzahl der layer" eingeben lassen.
|
Re: Checkboxen machen mich wahnsinnig!
Zitat:
|
Re: Checkboxen machen mich wahnsinnig!
Nein.
Option 1 ist imemr aktiv. wenn 2-9 aktiviert ist, sind alle vorherigen auch aktiv - wenn 4 aktiv, dann auch 2 und 3. also nichts anderes als "wie viele optionen?". |
Re: Checkboxen machen mich wahnsinnig!
Ja aber wie umständlich ist das bitte für den Benutzer wenn er in einem Spinedit eingeben muss wie viele Optionen aktiviert werden sollen... Da ist es halt wirklich einfacher so wie sonicfire es vorhat und so ist es auch normalerweise üblich :gruebel:
|
Re: Checkboxen machen mich wahnsinnig!
Hallo,
ich verstehe zwar nicht ganz, was der Code bezwecken soll habe bei CheckBox 10 aufgehört zu zählen, aber viell. hilft ja folgendes
Delphi-Quellcode:
Damit wird das OnClick temporär deaktiviert und stört nicht,
procedure CheckBox_SetCheck(theCheckBox: TCheckBox; bCheck: Boolean);
var TempProc: procedure (Sender: TObject) of object; begin if theCheckBox<>NIL then begin TempProc:= theCheckBox.OnClick; theCheckBox.OnClick:= NIL; theCheckBox.Checked:= bCheck; theCheckBox.OnClick:= TempProc; end end; wenn man an den Checkboxen manuell rumfummelt. Heiko |
Re: Checkboxen machen mich wahnsinnig!
Zitat:
Also statt
Delphi-Quellcode:
einfach
...
if VeloLayers = (Sender as TCheckBox).Tag then begin For i:=1 to VeloLayers-1 do begin BoxToCheck[i].Enabled := True; BoxToCheck[i].Checked := False; end end ...
Delphi-Quellcode:
...
if VeloLayers = (Sender as TCheckBox).Tag then begin For i:=VeloLayers-1 downto 1 do begin BoxToCheck[i].Enabled := True; BoxToCheck[i].Checked := False; end end ... |
Re: Checkboxen machen mich wahnsinnig!
Zitat:
Bist ECHT ein krasser Checker!! :shock: Ich glaubs nicht - so geht es!! :spin2: Danke auch an alle anderen! :) |
Re: Checkboxen machen mich wahnsinnig!
Moin :-)
Auch wenn das Problem gelöst scheint, so darf ich dennoch eine kleine Anmerkung machen !? Wie bereits gesagt, löst das Setzen von Checked immer das Ereignis OnClick aus...soweit, so dumm *gg* Es gibt aber eine einfache Lösung (sogar mit Delphi-Boardmitteln ;-) ). Hierzu ein kleines Beispielmit 3 Checkboxen:
Delphi-Quellcode:
Interessant ist hier Checkboxe.State, dessen Eigenschaft man durchaus zur Laufzeit setzen kann...entweder im MouseUp- oder wie hier 'weitergeleitet' an die Prozedure CheckBoxStatus. Somit umgeht man das Auslösen des OnClick-Ereignisses..
procedure TForm.CheckBox1MouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin CheckBoxStatus(Sender as TCheckBox); end; {zum 'Abfangen' der Leertaste, welche auch den Status setzen kann } procedure TForm1.CheckBox1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = ORD(#32) then CheckBoxStatus(Sender as TCheckBox); end; { allg. Proc für die Checkboxen} procedure TForm1.CheckBoxStatus(Sender: TcheckBox); begin if Sender.Name = 'CheckBox1' then begin Checkbox2.State := cbUnchecked; //--setzen des Status auf unchecked Checkbox3.State := cbUnchecked; end; if Sender.Name = 'CheckBox2' then begin Checkbox1.State := cbUnchecked; Checkbox3.State := cbUnchecked; end; if Sender.Name = 'CheckBox3' then begin Checkbox1.State := cbUnchecked; Checkbox2.State := cbUnchecked; end; end; Eine Checkbos erhält automatisch den Status cbChecked, sobald sie angeklickt oder (sofern per Tab focusiert wurde) die Leertaste gedrückt wurde. Sollen andere Checkboxen in Abhängigkeit einer bestimmten Checkbox den Status cbChecked erhalten, so löst man das elegant wiederum über
Code:
;-)
Checkbox.State := cbChecked
Ob eine Checkbox markiert ist, lässt sich zum einen ja über
Code:
oder über
if CheckBox.Checked then..
Code:
ermitteln; für den häkchenfreien Zustand dann entsprechend so:
if Checkbox.State=cbChecked
Code:
bzw
if not CheckBox.Checked then..
Code:
..
if Checkbox.State=cbUnChecked
Zu diesem Problem gibt es hier ![]() ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz