AGB  ·  Datenschutz  ·  Impressum  







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

Event in einer Class programmieren

Ein Thema von Chemiker · begonnen am 5. Okt 2008 · letzter Beitrag vom 6. Okt 2008
Antwort Antwort
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#1

Event in einer Class programmieren

  Alt 5. Okt 2008, 11:01
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:
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;
Das Ereignis zuweisen geht so:

Delphi-Quellcode:
procedure TForm3.FormCreate(Sender: TObject);
begin
  ComTest2:= THPLCom1.Create(self);
  ComTest2.FPack1.OnStringPacket:= MyStringPacketTest; // Event zuweisen
end;
Das Ereignis verwenden so:

Delphi-Quellcode:
Procedure TForm3.MyStringPacketTest (Sender: TObject; Data: String); // Event ausführen
begin
  MemoDatenAnzeigen.lines.Add(Data);
end;
Ich will nun die Class in eine separate Unit ablegen und suche jetzt eine Möglichkeit das Ereignis mit in die Class zu integrieren.

Die Class in der separaten Unit sieht so aus:

Delphi-Quellcode:
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;
An welcher Stelle und wie kann ich das Ereignis in der Class ablegen?

Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.993 Beiträge
 
Delphi 7 Professional
 
#2

Re: Event in einer Class programmieren

  Alt 5. Okt 2008, 12:14
Moin, Moin.

Kommt auf das Event an, du willst ein individuelles Event erstellen. Also zuerst eine Typdefinition:
TMyDataEvent = procedure(Data:String) of Object; Danach muss ein Methodenzeiger im private-Abschnitt bereitgestellt werden:
Delphi-Quellcode:
private
  FOnData : TMyDataEvent
Danach im published-Abschnitt die Eigenschaft für das Ereignis definieren:
Delphi-Quellcode:
published
  property OnData : TMyDataEvent read FOnData write FOnData
Das sollte eigentlich schon alles sein.

Na, nicht ganz, der Aufruf fehlt nun noch:
if Assigned(FOnData) then FOnData(Self,'mein string'); // edit: Jens hat Recht, der Aufruf sollte noch dabei sein
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Event in einer Class programmieren

  Alt 5. Okt 2008, 12:42
Du kannst dir das mal in meiner Klasse TFileSplitter angucken: http://www.michael-puff.de/Developer/Delphi/Demos -> TFileSplitter.zip
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: Event in einer Class programmieren

  Alt 5. Okt 2008, 14:25
@taaktaak: der Vollständigkeit halber fehlt noch wie man das Event dann auslöst Dann wäre es schon beinahe Codelib-fähig
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Event in einer Class programmieren

  Alt 5. Okt 2008, 18:20
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:
TApdDataPacket.OnStringPacket

property OnStringPacket : TStringPacketNotifyEvent

TStringPacketNotifyEvent = procedure(

Sender : TObject; Data : string) of object;

Defines an event handler that is called when a complete data packet is available.

Data is the actual data in the packet. The data packet is only available for the duration of the event.
Note that a null character (#0) in the collected data may terminate the Data string prematurely. This is due to the way that Delphi and C++Builder implement huge strings. If you are expecting null characters in the collected data, use the OnPacket event instead.
Meine Class sieht jetzt so aus:

Delphi-Quellcode:
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;
Im Testprogramm weise ich das Event so zu:

Delphi-Quellcode:
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;
So wird das Event aufgerufen:

Delphi-Quellcode:
Procedure TfrmComPortPacket.MyString (Sender: TObject; Data: String);
begin
  Memo1.Lines.Add(Data);
end;
Das Programm lässt sich ausführen, aber das Ereignis wird nicht aufgerufen.

An welcher Stelle muss der Aufruf:

if Assigned(FOnData) then FOnData(Self,'mein string'); angegeben werden.


Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Event in einer Class programmieren

  Alt 5. Okt 2008, 18:34
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.
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.993 Beiträge
 
Delphi 7 Professional
 
#7

Re: Event in einer Class programmieren

  Alt 5. Okt 2008, 19:33
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
Ralph
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#8

Re: Event in einer Class programmieren

  Alt 6. Okt 2008, 10:44
Delphi-Quellcode:
 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;
Wichtig: Bei der Zuweisung von "FStringPackete" muss auch "FStringPackete.OnData" zugewiesen werden.
Delphi-Quellcode:
FStringPackete := ???
FStringPackete.OnData := MyOnData;
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Event in einer Class programmieren

  Alt 6. Okt 2008, 22:54
Hallo,

habe den Vorschlag von mirage228 umgesetzt.

Die Klasse sieht jetzt so aus:

Delphi-Quellcode:
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;
Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  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 07:13 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