AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi selber aufrufen von OnChange verhindern?
Thema durchsuchen
Ansicht
Themen-Optionen

selber aufrufen von OnChange verhindern?

Ein Thema von moelski · begonnen am 26. Jun 2007 · letzter Beitrag vom 26. Jun 2007
Antwort Antwort
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#1

selber aufrufen von OnChange verhindern?

  Alt 26. Jun 2007, 12:55
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?
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: selber aufrufen von OnChange verhindern?

  Alt 26. Jun 2007, 13:00
Du könntest die Eigenschaft .Tag verwenden um ein Sperrkriterium zu implemnetieren.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: selber aufrufen von OnChange verhindern?

  Alt 26. Jun 2007, 13:01
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: selber aufrufen von OnChange verhindern?

  Alt 26. Jun 2007, 13:10
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
Heiko
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#5

Re: selber aufrufen von OnChange verhindern?

  Alt 26. Jun 2007, 13:10
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 ....
If ChangedManuell then Exit; // nur Useränderungen zulassen ! Das ist vom Aufwand her überschaubar ...
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Benutzerbild von cruiser
cruiser

Registriert seit: 23. Dez 2003
Ort: Königsbrück/Sachsen
455 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: selber aufrufen von OnChange verhindern?

  Alt 26. Jun 2007, 13:14
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
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#7

Re: selber aufrufen von OnChange verhindern?

  Alt 26. Jun 2007, 13:20
Danke für den Hinweis.
Das lässt sich schnell anpassen
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
kalmi01
(Gast)

n/a Beiträge
 
#8

Re: selber aufrufen von OnChange verhindern?

  Alt 26. Jun 2007, 13:28
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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: selber aufrufen von OnChange verhindern?

  Alt 26. Jun 2007, 13:40
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:25 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