![]() |
Delphi-Version: 5
Eigene Ereignisse für ein Object
Hi,
bei der Erstellung einer Komponente stoße ich doch immer wieder auf Dinge, die ich noch nie gemacht habe. Deswegen muß ich mal wieder Fragen. Für viele von euch sicherlich selbsterklärend, aber ich hab's noch nicht kapiert. Haben eine grafische Komponente, z.B. eine Listbox. Diese MyListbox hat ja Items. Im meinem Fall sind die Items jetzt mal ein ganz simple TObject, organisiert in einer TCollection. Jetzt möchte ich jedem Object ein eigenes Ereignis verpassen...als Beispiel vielleicht ein OnChanged (ob's das jetzt schon gibt ist ja egal, ist ja nur ein Beispiel), das ausgelöst werden soll, wenn sich an irgendeiner Property was ändert. Diesem Ereignis soll in der MyListbox dann eine Procedure hinzugefügt werden. Aber ich will auch noch Parameter mit übergeben. Also z.B. OnChanged(Sender: TObject; ItemIndex: Integer); Ich hab mal ein bischen in den Delphi-Sourcecodes geguckt, um rauszukriegen, wie das da gemacht wird, aber da werde ich von der Menge erschlagen. Ich bräuchte mal ein Beispiel, wie sowas in der Unit in der die Items definiert sind, aussehen muß. |
AW: Eigene Ereignisse für ein Object
Ich glaube, du musst nur einen eigenen Callback dafür definieren
Delphi-Quellcode:
Dann im Private deiner Komponente:
type TOnItemChange = procedure(Sender: TObject; ItemIndex: Integer) of object
Delphi-Quellcode:
und von außen kannst du es mit einer eigenen Prozedur beschreiben
private
fOnItemChange: TOnItemChange; public property OnItemChange: TOnItemChange read fOnItemChange write fOnItemChange;
Delphi-Quellcode:
Ich hoffe, dass du genau danach gesucht hast..
procedure OnItemChange(Sender: TObject; ItemIndex: Integer);
DeineKomponente.OnItemChange:= OnItemChange |
AW: Eigene Ereignisse für ein Object
Zitat:
Delphi-Quellcode:
procedure TMyForm.OnItemChange(Sender: TObject; ItemIndex: Integer);
|
AW: Eigene Ereignisse für ein Object
Ich würde hier ein Konzept ähnlich der
![]() Jedes Element, was der Liste hinzugefügt wird (im Notify der Liste), verknüpft sich mit dem Eventhandler der Liste (abhängen beim Remove nicht vergessen). Und die Liste leitet diese Events an dein Control weiter. |
AW: Eigene Ereignisse für ein Object
Okay, das ist soweit klar.
Aber ich muß ja noch irgendwo einen "Auslöser" definieren, der das OnItemChange-Ereignis auslöst. Ich will ja keine geerbten Ereignisse, sondern ein neues definieren, z.B. OnSelectChange. Ich habe das jetzt so gelöst (nicht Themarelevante Codeabschnitte habe ich mal rausgeschnitten):
Delphi-Quellcode:
Macht man das so?
Type
TOnSelectChange=procedure(Sender: TObject; ItemIndex: Integer) of object; Type TEntry=class(TCollectionItem) private FSelected: Boolean; FOnSelectChange: TOnSelectChange; procedure SetSelected(const Value: Boolean); public constructor Create(Collection: TCollection; EntryTypes: TEntryTypes); destructor Destroy; published property Selected: Boolean read FSelected write SetSelected; property OnSelectChange: TOnSelectChange read FOnSelectChange write FOnSelectChange; end; ... implementation { TEntries } procedure TEntry.SetSelected(const Value: Boolean); var OldValue: Boolean; begin if not Assigned(FOnSelectChange) then Exit; OldValue:=FSelected; FSelected := Value; if (FSelected<>OldValue) then OnSelectChange(self, self.Index); end; Jetzt habe ich noch ein Problem damit. Die oben definiert Klasse TEntry bzw. deren Collection ist ja Bestandteil meiner Komponente. In der "Main"-Unit dieser Komponente wird diese Collection ja erzeugt, und es können über den OI Entries hinzugefügt werden. Jedes´m Item soll dem OnSelectChange-Ereignis eine entsprechende Procedure in der Main-Unit hinzugefügt werden. Grund ist der, dass ich z.B. in der Main erkenne, wann sich ein SelectState ändert, und ein Repaint ausgelöst werden muß. Jetzt muß ich aber nach dem Create der Komponente jedem bereits vorhandenen Items auch diese Procedure aus der Main-Unit dem OnSelectChange-Ereignis zuweisen. Wo mache ich das? Wann werden die Items, die im IO definiert wurden tatsächlich zur Runtime erzeugt? |
AW: Eigene Ereignisse für ein Object
Verfügt TEntryList über ein Ereignis OnAddItem? Da könnte man es relativ bequem setzen?
Delphi-Quellcode:
procedure TMyForm.SelectChange(..);
begin FMyEntryList.Invalidate; end; procedure TMyForm.MyEntryListOnAddItem(..); begin FMyEntryList.Last.OnSelectChange := SelectChange; end; |
AW: Eigene Ereignisse für ein Object
Ich habe zwar ein Function Add
Delphi-Quellcode:
Aber die wird nach dem Start nie aufgerufen, also mit den im OI vordefinierten Entries.
type
TEntries=class(TCollection) private FonEntryAdd: TOnEntryAdd; function getItem(index: Integer): TEntry; procedure setItem(index: Integer; const Entry: TEntry); public property Items[index: Integer]: TEntry read getItem write setItem; default; function Add: TEntry; virtual; property OnEntryAdd: TOnEntryAdd read FonEntryAdd write FonEntryAdd; end; implementation { TEntries } function TEntries.Add: TEntry; begin Result := TEntry(inherited Add); if Assigned(FonEntryAdd) then self.OnEntryAdd(Self); end; |
AW: Eigene Ereignisse für ein Object
Zitat:
|
AW: Eigene Ereignisse für ein Object
Zitat:
|
AW: Eigene Ereignisse für ein Object
Diese OnEntryAdd wird dir für deine Zwecke (Verfügbar schon zur Designzeit ect.) nicht viel bringen. Such mal bei TCollection im OI ein entsprechendes Ereignis. Und spendier deinen desctructors mal ein override;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:28 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