AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Eigene Ereignisse für ein Object

Ein Thema von Captnemo · begonnen am 26. Sep 2014 · letzter Beitrag vom 29. Sep 2014
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#1

Eigene Ereignisse für ein Object

  Alt 26. Sep 2014, 14:21
Delphi-Version: 5
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ß.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
-=ZGD=-

Registriert seit: 25. Apr 2006
Ort: Bad Aibling
105 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

AW: Eigene Ereignisse für ein Object

  Alt 26. Sep 2014, 14:34
Ich glaube, du musst nur einen eigenen Callback dafür definieren

type TOnItemChange = procedure(Sender: TObject; ItemIndex: Integer) of object Dann im Private deiner Komponente:

Delphi-Quellcode:
private
fOnItemChange: TOnItemChange;

public
 property OnItemChange: TOnItemChange read fOnItemChange write fOnItemChange;
und von außen kannst du es mit einer eigenen Prozedur beschreiben

Delphi-Quellcode:
procedure OnItemChange(Sender: TObject; ItemIndex: Integer);

DeineKomponente.OnItemChange:= OnItemChange
Ich hoffe, dass du genau danach gesucht hast..
Stefan Michalk
Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#3

AW: Eigene Ereignisse für ein Object

  Alt 26. Sep 2014, 14:41
von außen kannst du es mit einer eigenen Prozedur beschreiben

procedure OnItemChange(Sender: TObject; ItemIndex: Integer);
Die OnItemChange Prozedur passt nicht zur Methodensignatur. Mit dieser hier würde es gehen:

procedure TMyForm.OnItemChange(Sender: TObject; ItemIndex: Integer);
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: Eigene Ereignisse für ein Object

  Alt 26. Sep 2014, 14:57
Ich würde hier ein Konzept ähnlich der MSDN-Library durchsuchenBindingList vorschlagen.
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#5

AW: Eigene Ereignisse für ein Object

  Alt 29. Sep 2014, 08:24
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:
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;
Macht man das so?

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?
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Eigene Ereignisse für ein Object

  Alt 29. Sep 2014, 10:02
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;
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#7

AW: Eigene Ereignisse für ein Object

  Alt 29. Sep 2014, 10:40
Ich habe zwar ein Function Add
Delphi-Quellcode:
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;
Aber die wird nach dem Start nie aufgerufen, also mit den im OI vordefinierten Entries.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Zoot

Registriert seit: 30. Jan 2006
Ort: Hessen
113 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Eigene Ereignisse für ein Object

  Alt 29. Sep 2014, 11:00
Ich habe zwar ein Function Add


Aber die wird nach dem Start nie aufgerufen, also mit den im OI vordefinierten Entries.
Versuchs mal mit dem Zauberwort "override" statt "virtual".
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#9

AW: Eigene Ereignisse für ein Object

  Alt 29. Sep 2014, 11:14
Ich habe zwar ein Function Add


Aber die wird nach dem Start nie aufgerufen, also mit den im OI vordefinierten Entries.
Versuchs mal mit dem Zauberwort "override" statt "virtual".
Geht nicht. Dann bekomme ich den Fehler: E2170 Ein nichtvirtuelle Methode kann nicht überschrieben werden.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Eigene Ereignisse für ein Object

  Alt 29. Sep 2014, 11:39
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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 06:22 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