![]() |
Event in einer Class programmieren
Hallo,
ich möchte ein Ereignis in eine Class integrieren. Wenn die Class innerhalb des Forms deklariert wird ist das so möglich:
Delphi-Quellcode:
Das Ereignis zuweisen geht so:
type
THPLCom1 = class(TComponent) private FCom1: TApdCustomComPort; FPack1: TApdDataPacket; public Constructor Create(AOwner : TComponent); override; destructor Destroy; override; end; type TForm3 = class(TForm) btnCOMPortOeffnen: TButton; btnCOMPortSchliessen: TButton; MemoDatenAnzeigen: TMemo; procedure btnCOMPortOeffnenClick(Sender: TObject); procedure btnCOMPortSchliessenClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } ComTest2: THPLCom1; Procedure MyStringPacketTest (Sender: TObject; Data: String); // Event! end;
Delphi-Quellcode:
Das Ereignis verwenden so:
procedure TForm3.FormCreate(Sender: TObject);
begin ComTest2:= THPLCom1.Create(self); ComTest2.FPack1.OnStringPacket:= MyStringPacketTest; // Event zuweisen end;
Delphi-Quellcode:
Ich will nun die Class in eine separate Unit ablegen und suche jetzt eine Möglichkeit das Ereignis mit in die Class zu integrieren.
Procedure TForm3.MyStringPacketTest (Sender: TObject; Data: String); // Event ausführen
begin MemoDatenAnzeigen.lines.Add(Data); end; Die Class in der separaten Unit sieht so aus:
Delphi-Quellcode:
An welcher Stelle und wie kann ich das Ereignis in der Class ablegen?
unit uApdComPortDynamischErstellen;
interface uses Classes, AdPort, AdPacket; type THPLComPortClass= Class(TComponent) private FComPort : TApdCustomComPort; FStringPackete : TApdDataPacket; function GetOeffnen: Boolean; procedure SetOeffnen(const Value: Boolean); function GetZuweisen: TApdCustomComPort; procedure SetZuweisen(const Value: TApdCustomComPort); public Constructor Create(AOwner : TComponent); override; destructor Destroy; override; property Oeffnen: Boolean Read GetOeffnen Write SetOeffnen; property zuweisen: TApdCustomComPort Read GetZuweisen Write SetZuweisen; End; Bis bald Chemiker |
Re: Event in einer Class programmieren
Moin, Moin.
Kommt auf das Event an, du willst ein individuelles Event erstellen. Also zuerst eine Typdefinition:
Delphi-Quellcode:
Danach muss ein Methodenzeiger im private-Abschnitt bereitgestellt werden:
TMyDataEvent = procedure(Data:String) of Object;
Delphi-Quellcode:
Danach im published-Abschnitt die Eigenschaft für das Ereignis definieren:
private
FOnData : TMyDataEvent
Delphi-Quellcode:
Das sollte eigentlich schon alles sein.
published
property OnData : TMyDataEvent read FOnData write FOnData Na, nicht ganz, der Aufruf fehlt nun noch:
Delphi-Quellcode:
// edit: Jens hat Recht, der Aufruf sollte noch dabei sein :hi:
if Assigned(FOnData) then FOnData(Self,'mein string');
|
Re: Event in einer Class programmieren
Du kannst dir das mal in meiner Klasse TFileSplitter angucken:
![]() |
Re: Event in einer Class programmieren
@taaktaak: der Vollständigkeit halber fehlt noch wie man das Event dann auslöst :-) Dann wäre es schon beinahe Codelib-fähig
|
Re: Event in einer Class programmieren
Hallo taaktaak, Luckie,
vielen Dank für eure Hilfe. Ich bin aber noch nicht weiter gekommen. Das Event ist schon vorhanden in der Komponente: TApdDataPacket. In der Hilfe wird das Event so angegeben: Zitat:
Delphi-Quellcode:
Im Testprogramm weise ich das Event so zu:
TMyDataEvent = procedure(Sender: TObject; Data:String) of Object;
THPLComPortClass= Class(TComponent) private FComPort : TApdCustomComPort; FStringPackete : TApdDataPacket; // ---- in dieser Komponente ist das Event // schon vorhanden. FOnData : TMyDataEvent; // Event function GetOeffnen: Boolean; procedure SetOeffnen(const Value: Boolean); function GetZuweisen: TApdCustomComPort; procedure SetZuweisen(const Value: TApdCustomComPort); protected published property OnData : TMyDataEvent read FOnData write FOnData; // Event public Constructor Create(AOwner : TComponent); override; destructor Destroy; override; property Oeffnen: Boolean Read GetOeffnen Write SetOeffnen; property zuweisen: TApdCustomComPort Read GetZuweisen Write SetZuweisen; End;
Delphi-Quellcode:
So wird das Event aufgerufen:
type
TfrmComPortPacket = class(TForm) btnCOMOeffnen: TButton; btnCOMSchliessen: TButton; Memo1: TMemo; procedure btnCOMOeffnenClick(Sender: TObject); procedure btnCOMSchliessenClick(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } CP: THPLComPortClass; Procedure MyString (Sender: TObject; Data: String); end; procedure TfrmComPortPacket.FormCreate(Sender: TObject); begin CP:= THPLComPortClass.Create(Self); CP.OnData:= MyString; end;
Delphi-Quellcode:
Das Programm lässt sich ausführen, aber das Ereignis wird nicht aufgerufen.
Procedure TfrmComPortPacket.MyString (Sender: TObject; Data: String);
begin Memo1.Lines.Add(Data); end; An welcher Stelle muss der Aufruf:
Delphi-Quellcode:
angegeben werden.
if Assigned(FOnData) then FOnData(Self,'mein string');
Bis bald Chemiker |
Re: Event in einer Class programmieren
Du brauchst in Deiner Klasse einen Getter und einen Setter für "OnData". Im Setter musst Du das Event dann der Entsprechung in der TAdp...-Komponente zuweisen und im Getter von dort abrufen.
|
Re: Event in einer Class programmieren
Hmm, da habe ich die Aufgabenstellung gründlich falsch verstanden.
Du bindest also eine fremde Komponente, die dieses Event bereits zur Verfügung stellt, im private-Abschnitt deiner Komponente ein. Das Anwendungsprogramm soll dann das Event der fremden Komponente nutzen können. Puh, da bin ich überfragt - da ist mein Beispiel natürlich nicht hilfreich. Da muss ich leider passen :cry: |
Re: Event in einer Class programmieren
Delphi-Quellcode:
Wichtig: Bei der Zuweisung von "FStringPackete" muss auch "FStringPackete.OnData" zugewiesen werden.
THPLComPortClass= Class(TComponent)
private FComPort : TApdCustomComPort; FStringPackete : TApdDataPacket; // ---- in dieser Komponente ist das Event // schon vorhanden. FOnData : TMyDataEvent; // Event function GetOeffnen: Boolean; procedure SetOeffnen(const Value: Boolean); function GetZuweisen: TApdCustomComPort; procedure SetZuweisen(const Value: TApdCustomComPort); procedure MyOnData(Sender: TObject; Data: String); protected published property OnData : TMyDataEvent read FOnData write FOnData; // Event public Constructor Create(AOwner : TComponent); override; destructor Destroy; override; property Oeffnen: Boolean Read GetOeffnen Write SetOeffnen; property zuweisen: TApdCustomComPort Read GetZuweisen Write SetZuweisen; End; procedure THPLComPortClass.MyOnData(Sender: TObject; Data: String); begin if Assigned(FOnData) then FOnData(Self, Data); end;
Delphi-Quellcode:
FStringPackete := ???
FStringPackete.OnData := MyOnData; |
Re: Event in einer Class programmieren
Hallo,
habe den Vorschlag von mirage228 umgesetzt. Die Klasse sieht jetzt so aus:
Delphi-Quellcode:
Bis bald Chemiker
TMyDataEvent = procedure(Sender: TObject; Data:String) of Object;
THPLComPortClass= Class(TComponent) private FComPort : TApdCustomComPort; FStringPackete : TApdDataPacket; function GetOeffnen: Boolean; procedure SetOeffnen(const Value: Boolean); function GetZuweisen: TApdCustomComPort; procedure SetZuweisen(const Value: TApdCustomComPort); function GetOnData: TMyDataEvent; procedure SetOnData(const Value: TMyDataEvent); protected published property OnData : TMyDataEvent read GetOnData write SetOnData; public Constructor Create(AOwner : TComponent); override; destructor Destroy; override; usw. function THPLComPortClass.GetOnData: TMyDataEvent; begin Result:= FStringPackete.OnStringPacket; end; procedure THPLComPortClass.SetOnData(const Value: TMyDataEvent); begin FStringPackete.OnStringPacket:= Value; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:25 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