Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi OnChange bei jedem Itemindex auslösen (https://www.delphipraxis.net/153857-onchange-bei-jedem-itemindex-ausloesen.html)

Ti-Delphin 18. Aug 2010 09:45

Delphi-Version: 2007

OnChange bei jedem Itemindex auslösen
 
Hallo,

das onChange Ereignis einer Combobox kann von hause aus nur manuell ausgelöst werden (s.u. CodeGear Help)

Zitat:

Anmerkung: OnChange tritt nur als Reaktion auf Benutzeraktionen ein.
Wenn die Eigenschaft Text programmgesteuert geändert wird, wird das Ereignis OnChange nicht ausgelöst.
Gibt es eine Möglichkeit wie ich bei einem Programmgesteuerten ItemIndex change automatisch, das OnChange-Ereignis auslösen kann??

Hintergrund: Lese aus einer Text Datei die Itemindex-Werte aus und weise sie den entsprechenden Comboboxen zu.
In Abhängigkeit der Itemindex werden aber andere Comboboxen Ein/Ausgeblendet (durch onChange Prozeduren)....

Danke und Gruß

mkinzler 18. Aug 2010 09:47

AW: OnChange bei jedem Itemindex auslösen
 
Rufe die Methode direkt auf.

DeddyH 18. Aug 2010 09:48

AW: OnChange bei jedem Itemindex auslösen
 
Wenn das nicht an 1000 Stellen im Quelltext geschieht, kannst Du doch einfach die OnChange-Methode aufrufen.
Delphi-Quellcode:
ComboBox.ItemIndex := 42;
ComboBoxChange(ComboBox);

Ti-Delphin 18. Aug 2010 10:05

AW: OnChange bei jedem Itemindex auslösen
 
Hab's auch schon direkt aufgerufen...dachte nur es gäbe eine elegantere Methode dies zu tun :-)

Trotzdem danke für die schnellen Antworten ..

mleyen 18. Aug 2010 10:19

AW: OnChange bei jedem Itemindex auslösen
 
Klar gibts die:
Delphi-Quellcode:
type
  TCBox2 = class(TComboBox)
  protected
    procedure SetItemIndex(const Value: Integer); override;
  published
    property ItemIndex: Integer read GetItemIndex write SetItemIndex;
  end;

{ TCBox2 }

procedure TCBox2.SetItemIndex(const Value: Integer);
begin
  inherited;
  if Assigned(Self.OnChange) then
    Self.OnChange(Self);
end;

himitsu 18. Aug 2010 10:23

AW: OnChange bei jedem Itemindex auslösen
 
Zitat:

Zitat von Ti-Delphin (Beitrag 1042988)
Hab's auch schon direkt aufgerufen...dachte nur es gäbe eine elegantere Methode dies zu tun :-)

Delphi-Quellcode:
procedure SetComboBoxItemIndex(ComboBox: TComboBox; NewIndex: Integer);
begin
  ComboBox.ItemIndex := 42;
  if Assigned(ComboBox.OnChange) then
    ComboBox.OnChange(ComboBox);
end;
Ab D2006 könnte man das auch als Class-Helper für TComboBox/TCustomComboBox bereitstellen.

DeddyH 18. Aug 2010 10:28

AW: OnChange bei jedem Itemindex auslösen
 
Noch bequemer:
Delphi-Quellcode:
type
  TComboBox = class(StdCtrls.TComboBox)
  protected
    procedure SetItemIndex(const Value: Integer); override;
  published
    property ItemIndex: Integer read GetItemIndex write SetItemIndex;
  end;

  //Hier dann erst die Deklaration des Formulars mit den ComboBoxen

{ TComboBox }

procedure TComboBox.SetItemIndex(const Value: Integer);
begin
  inherited;
  if Assigned(Self.OnChange) then
    Self.OnChange(Self);
end;
Somit entfällt ein Typecast, und das klappt auch unter älteren Delphi-Versionen.

Ti-Delphin 18. Aug 2010 11:33

AW: OnChange bei jedem Itemindex auslösen
 
:thumb:..genial..sowas meinte ich... so kann man also die Eigenschaften der Objekte zentral erweitern..

himitsu 18. Aug 2010 11:39

AW: OnChange bei jedem Itemindex auslösen
 
Zitat:

Zitat von Ti-Delphin (Beitrag 1043015)
:thumb:..genial..sowas meinte ich... so kann man also die Eigenschaften der Objekte zentral erweitern..

Es ist mehr ein inoffizieller Hack.

Offiziell sind Class Helper für gewisse Änderungen vorgesehn.


Die VCL nimmt die Deklarationen, welche in der Form-Deklaration anliegen, also wenn man da vorher was ändert/ersetzt/überschreibt, dann gilt es auch da und es werden diese Komponenten mit der überschriebenen Klasse erstellt.

Auch kann man sowas in andere Units auslagern und muß diese Units nur als Letztes in der Usesklausel aufnehmen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:31 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