Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi selber aufrufen von OnChange verhindern? (https://www.delphipraxis.net/94748-selber-aufrufen-von-onchange-verhindern.html)

moelski 26. Jun 2007 12:55


selber aufrufen von OnChange verhindern?
 
Moin !

Ich habe hier ein generelles Problem und überlege wie ich das am besten angehe ...
Folgendes: Angenommen man hat eine DropDown Box in einem Dialog in der die Werte 1-4 stehen. Bei einer Auswahl (OnChange) wird dieser Wert als Linenstärke genutzt.

Wenn man nun diesen Dialog öffnet würde man ja gerne direkt den aktuellen Wert der Linienstärke in der Box stehen sehen. Also weist man beim OnShow z.B. den Wert der ComboBox zu. Aber das löst eben auch OnChange aus. Und eben das würde ich gerne verhindern, weil es oft zu Problemen führen kann und in meinem Fall obendrein unnütz ist.

Nun könnte man ja beim Zuweisen das OnChange auf NIL setzen und dann das Event wieder zuweisen nachdem man den Wert gesetzt hat.

Aber wenn man 20-100 Eigenschaften setzen kann ist das irgendwie eine ziemlich lange Liste die man da berücksichtigen muss.

Wie löst man also dieses Problem am elegantesten?

mkinzler 26. Jun 2007 13:00

Re: selber aufrufen von OnChange verhindern?
 
Du könntest die Eigenschaft .Tag verwenden um ein Sperrkriterium zu implemnetieren.

SirThornberry 26. Jun 2007 13:01

Re: selber aufrufen von OnChange verhindern?
 
du kannst nicht unterscheiden ob die Combobox das OnChange aufgerufen hat oder der Programmierer durch manuellen Aufruf von OnChange mit entsprechendem Sender. Wenn allerdings jemand dem OnShow-Ereignis des Formulares das OnChange der Combobox zuordnet siehst du das am Sender.

hoika 26. Jun 2007 13:10

Re: selber aufrufen von OnChange verhindern?
 
Hallo,

ich habe mir dafür extra Routinen geschrieben,
am Bsp einer CheckBox sieht das dann so aus.


Delphi-Quellcode:
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
  else
  begin
   {$IFDEF DEBUG}
    MBDebug(sFormName+'.CheckBox_SetCheck'
      +#13#10+'<theCheckBox>=NIL');
   {$ENDIF}
  end;
end; { CheckBox_SetCheck }
Heiko

moelski 26. Jun 2007 13:10

Re: selber aufrufen von OnChange verhindern?
 
Moin !

Das mit dem TAG war ein giter Hinweis.
Ich nehme einfach eine globale Variable

ChangedManuell : Boolean;

Und dann mache ich das so:

Delphi-Quellcode:
procedure TGraphViewDialog.ChartListBoxClick(Sender: TObject);
begin
  ChangedManuell := True; // ab hier das OnChange verhindern
  Line_Active.Checked        := (MasterChart[ChartListBox.ItemIndex] as TFastLineSeries).Active;
  ColorDialog.Color          := (MasterChart[ChartListBox.ItemIndex] as TFastLineSeries).SeriesColor;
  Line_ColorView.Brush.Color := (MasterChart[ChartListBox.ItemIndex] as TFastLineSeries).SeriesColor;
  Line_Breite.Value          := (MasterChart[ChartListBox.ItemIndex] as TFastLineSeries).LinePen.Width;
  ChangedManuell := False;
end;
Dann brauchts in jeder Funktion nur ein ....
Delphi-Quellcode:
If ChangedManuell then Exit;   // nur Useränderungen zulassen !
Das ist vom Aufwand her überschaubar ...

cruiser 26. Jun 2007 13:14

Re: selber aufrufen von OnChange verhindern?
 
Zitat:

Zitat von moelski
Ich nehme einfach eine globale Variable

Würde ich von abraten. Deklarier lieber eine private Variable in der Dialog-Klassendefinition. Globale Variablen neigen dazu Bei multiplen Aufrufen Interferenzen zu erzeugen :wink:

moelski 26. Jun 2007 13:20

Re: selber aufrufen von OnChange verhindern?
 
Danke für den Hinweis. :thumb:
Das lässt sich schnell anpassen :stupid:

kalmi01 26. Jun 2007 13:28

Re: selber aufrufen von OnChange verhindern?
 
Also die Variante mit:
Delphi-Quellcode:
Button1.OnClick := nil;
... mach was
Button1.OnClick := Button1Click;
Verwende ich selbst und finde sie (wie sollte es da auch anders sein ?) am elegantesten.
Lösungen mit Variablen laufen irgendwie nicht so ganz rund.
Ausserdem stoppt das Event selbst die weitere Verwendung des Selbigen und gibt sich selbst auch wieder frei.
Sowas geht mit Variablen nur wesentlich aufwändiger und unschöner.

marabu 26. Jun 2007 13:40

Re: selber aufrufen von OnChange verhindern?
 
Hallo,

wenn die Komponente nicht Enabled ist, dann werden auch keine Ereignisse ausgelöst:

Delphi-Quellcode:
procedure TDemoForm.ButtonClick(Sender: TObject);
begin
  with ComboBox do
  begin
    Enabled := False;
    ItemIndex := Succ(ItemIndex) mod Items.Count;
    Enabled := True;
  end;
end;

procedure TDemoForm.ComboBoxChange(Sender: TObject);
begin
  with ComboBox do
    if ItemIndex < 0
      then ShowMessage('?')
      else ShowMessage(Text);
end;
Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 Uhr.

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