Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Checkbox onClick (https://www.delphipraxis.net/127872-checkbox-onclick.html)

Bomberbb 20. Jan 2009 14:59


Checkbox onClick
 
Es ist wieder eine Zeit hin, dass ich mit Komponenten gearbeitet habe. Ich hab nur ein Problem mit der Sichtbarkeit.
Ich möchte eine Checkbox von TCheckbox ableiten, die nicht die Eigenschaft hat, dass bei dem Setzen von checked im Quelltext nicht automatisch onClick aufgerufen wird. Habe herausgefunden, dass tCheckbox ein Nachfahre von tCustomCheckbox ist. Nun würde ich gerne in meiner Abgeleiteten Klasse auf fState zurückgreifen.
Delphi-Quellcode:
Procedure TMeineCheckBox.SetCheckedOnly(inCheckedStatus:Boolean);
begin
  If inCheckedStatus Then FState := cbChecked Else FState := cbUnchecked;
End;
Problem ist nur, dass FState private deklariert ist. Ich sehe zur Zeit irgendwie keine Möglichkeit auf den Wert in der Abgeleiteten Klasse zuzugreifen.

Hab auch schon im Forum nach Möglichkeiten gesucht. Bei der Lösung onClick temporär auf nil zu setzen wird mein Prog arg langsam.

Sieht jemand eine andere Möglichkeit?

RWarnecke 20. Jan 2009 15:13

Re: Checkbox onClick
 
Mal eine Frage, wozu brauchst Du das genau ? Und wenn Du jetzt selber zur Laufzeit die TCustomCheckbox erstellst, würde Dir das dann weiterhelfen ?

Bomberbb 20. Jan 2009 15:21

Re: Checkbox onClick
 
Ich möchte einfach nicht, dass wenn ich checked ein Wert im Quelltext zuweise onClick aufgerufen wird.

Dadurch kommt es im Programm immer wieder zu Problemen und die möchte ich nun gerne ausschließen.

RWarnecke 20. Jan 2009 15:41

Re: Checkbox onClick
 
Wieso Du kannst doch das OnClick - Ereignis einfach weglassen. Und dann über einen Button den Status von Checked abfragen. Oder verstehe ich da etwas falsch ?

Bomberbb 20. Jan 2009 15:46

Re: Checkbox onClick
 
Wenn Du im Quelltext so etwas schreibst:
Delphi-Quellcode:
checkbox.checked:=true;
Wird beim Ausführen dieser Zeile das onClickEreignis aufgerufen. Was man ja nicht unbedingt haben will...

Matze 20. Jan 2009 15:54

Re: Checkbox onClick
 
Mal ein sehr unschöner Workaround. Ob er klappt, weiß ich allerdings nicht.

Delphi-Quellcode:
CheckBox.OnClick := nil;
CheckBox.Checked := true;
CheckBox.OnClick := CheckBoxClick;
Grüße, Matze

HenKst 20. Jan 2009 16:03

Re: Checkbox onClick
 
etwas weniger unschön vielleicht

Delphi-Quellcode:
MyCheckBox.ClicksDisabled:= true;
MyCheckBox.Checked:= true;
MyCheckBox.ClicksDisabled:= false;
Die ClicksDisabled property ist bei der normalen checkbox aus irgendeinem Grund protected(hab den code dazu nich gefunden...), wenn man sich aber seine eigene von TCustomCheckbox ableitet scheints zu klappen.

€dit:
okay clicksdisabled ist in TButtonControl schon als proctected declariert, klappt aber trotzdem problemlos wenn man sich seine eigene CheckBox ableitet^^

Bomberbb 20. Jan 2009 16:08

Re: Checkbox onClick
 
Bin beim Stöbern stdctrls.pas auch auf ClicksDisabled gestoßen.
Delphi-Quellcode:
Procedure MeineCheckBox.SetCheckedOnly(inCheckedStatus:Boolean);
var
  Save:Boolean;
begin
  Save:=ClicksDisabled;
  ClicksDisabled:=true;
  checked:= inCheckedStatus;
  ClicksDisabled:=Save;
End;
und werde es nun wohl so lösen...

quendolineDD 20. Jan 2009 16:09

Re: Checkbox onClick
 
Beide Workarounds sind funktionsfähig, wobei der von Henkst eher dem entspricht, was wohl erwartet wird um das zu umgehen.
Wenn man sich mal den Quellcode in TCustomCheckBox anschaut sieht man auch, das hier ein Klick ausgeführt wird.
Delphi-Quellcode:
procedure TCustomCheckBox.SetState(Value: TCheckBoxState);
begin
  if FState <> Value then
  begin
    FState := Value;
    if HandleAllocated then
      SendMessage(Handle, BM_SETCHECK, Integer(FState), 0);
    if not ClicksDisabled then Click;
  end;
end;
Lg

mannewolff 20. Jan 2009 16:10

Re: Checkbox onClick
 
Zitat:

Zitat von HenKst
etwas weniger unschön vielleicht
Delphi-Quellcode:
MyCheckBox.ClicksDisabled:= true;
MyCheckBox.Checked:= true;
MyCheckBox.ClicksDisabled:= false;

Ich mache das so, dass ich eine Variable habe die sowas wie "Handlerfreigabe" heisst. In den Ereignisprozeduren steht dann

Delphi-Quellcode:
if not Handlerfreigabe then exit;
Beim Laden von Datensätzen und setzen der Controls wird dann die Handlerfreigabe dementsprechend gesetzt:

Delphi-Quellcode:
Handlerfreigabe := false;
MyCheckBox.Checked:= true;
...
Handlerfreigabe := true;
Gefrickelt, aber hat sich in meinen Programmen bewährt. Hilft auch bei doppelten betätigen des Speicherbuttons etc., weil ich die Handlerfreigabe in allen Ereignisprozeduren habe. Während ich lade, speichere etc. interessieren mich die User-Inputs nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:01 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz