Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Objekte zur laufzeit erstellen und NEUE events zuordnen (https://www.delphipraxis.net/145564-objekte-zur-laufzeit-erstellen-und-neue-events-zuordnen.html)

DelTurbo 4. Jan 2010 14:13


Objekte zur laufzeit erstellen und NEUE events zuordnen
 
Hi,

ich habe ein problem. Ich habe mir eine Unit gemacht die soll vollkommen "alleine" laufen. Also nix von Form1 wissen. Objecte mit z.b. obj:=Tobj.Create erstellen klappt alles. Nun habe ich aber ein Object dem ich ein event zuordnen müsste und ich weiss nicht wie. Es sind keine Objecte die irgendwie sichbar sind. Also keine Buttons oder sowas. Wie das geht weiss ich. Sowas wird auch an jeder ecke beschrieben.

Da die Unit keine Form besitzt stehe ich hier im moment auf dem schlauch. In der "MainUnit" klappt das einwanfrei. Da sind die proceduren ja oben im object (Form1) drinne. Wäre fein wenn mir mal einer auf die sprünge helfen könnte....


Vielen dank im voraus

himitsu 4. Jan 2010 14:23

Re: Objekte zur laufzeit erstellen und NEUE events zuordnen
 
Es müßen einach nur "Methoden" sein,

also kannst du dir in deiner Unit irgendeine Verwaltunsklasse erstellen und im Initialization-Abschnitt ein Objekt davon instantiieren.

Deine Methoden legst du nun in diese Klasse und kannst sie dann über das Objekt deinen Ereignissen zuweisen.

s.h.a.r.k 4. Jan 2010 14:25

Re: Objekte zur laufzeit erstellen und NEUE events zuordnen
 
Du musst deinem Object einen OnClick-Handler-Methode verpassen und dann dort, wo du es brauchst bzw. eben Zugriff darauf hast das OnClick-Event der Methode zuweisen:
Delphi-Quellcode:
TDeinObject = class(...)
public
  procedure OnClickHandler(Sender: TObject);
end;

{ In deiner Form-Unit erzeugst du wohl eine Instanz deines TDeinObject
  und dort musst du dann auch die Zuweisung des Event-Handlers macht: }

var
  do : TDeinObject;

procedure TForm1.Button1Click(Sender: TObject);
begin
  do := TDeinObject.Create(...);
  Button2.OnClick := do.OnClickHandler;
end;

dominikkv 4. Jan 2010 14:32

Re: Objekte zur laufzeit erstellen und NEUE events zuordnen
 
Generell kannnst du das so machen:

Zuerst hier die Klasse, die das Event auslöst
Delphi-Quellcode:
type
  TMeinEvent = procedure(Sender: TObject; Parameter: Integer) of Object;

  TMeineAusloesendeKlasse = class(TBla)
  private
    fMeinEvent: TMeinEvent;
  public
    OnMeinEvent: TMeinEvent read fMeinEvent write fMeinEvent;
    procedure IrgendEineProzedureDieDasEventAusloest;
  end;


procedure TMeineAusloesendeKlasse.IrgendEineProzedureDieDasEventAusloest();
begin
  if Assigned(fMeinEvent) then
    fMeinEvent(self, 17);
end;
Und jetzt die Klasse, die das Event implementiert (heißt das so?!):
Delphi-Quellcode:
type
  TMeineKlasse = class(TFoo)
  private
    fAndereKlasse: TMeineAusloesendeKlasse;
    procedure AndereKlasseHatEventAusgeloest(Sender: TObject; Parameter: Integer);
  public
    constructor Create();
  end;

constructor TMeineKlasse.Create();
begin
  fAndereKlasse := TMeineAusloesendeKlasse.Create;
  fAndereKlasse.OnMeinEvent := AndereKlasseHatEventAusgeloest;
end;

procedure TMeineKlasse.AndereKlasseHatEventAusgeloest(Sender: TObject; Parameter: Integer);
begin
  showmessage('Here we go!');
end;

DelTurbo 4. Jan 2010 14:44

Re: Objekte zur laufzeit erstellen und NEUE events zuordnen
 
Ersmtal tausend dank. Aber ich glaube ich peil das grad nicht. Hier mal ein beispiel...



Delphi-Quellcode:
unit FTP;

interface
uses
  clTcpClient, clFtp,clCertificateStore, clCertificate,
  ComCtrls,Classes;


implementation
uses
  SysUtils,IniFiles;


procedure CheckCert;
begin
   `statement`
end; {CheckCert}

procedure DoFTP(FName:String);
var
  Source   :TclFtp;
begin
  Source:=TclFtp.Create(nil);
  Source.OnVerifyServer:=CheckCert; <-- dort schimpft er rum, das die sachen nicht passen

[snip]

  Source.Free;
end;
EDIT: Ups, da hab ich nicht ausgepasst. Post überschnitten. Ich war die ganze zeit am antworten :oops:
Nochmal vielen dank. Ich versuch das mal umzusetzten.

DelTurbo 4. Jan 2010 15:10

Re: Objekte zur laufzeit erstellen und NEUE events zuordnen
 
Ufffffff,

ist das kompliziert. Wenn man sich mal den ASM-Code ansieht schreibt er nur den pointer auf die routine ins objekt (Also Objectadr.+$64). Aber damit man das "sauber" durch den compiler bekommt muss man so einen aufwand treiben??? Das hätte ich nicht gedacht. Kein wunder das ich wie Ochs vorm Berg da stehe.

Anhand meines Codes dachte ich "naja wird wohl nur irgendwo deklariert werden müssen"...

Da ihr nun wisst was ich genau meine bleibt die vorgehensweise???

sirius 4. Jan 2010 15:23

Re: Objekte zur laufzeit erstellen und NEUE events zuordnen
 
Die Vorgehensweise ist, dass du um CheckCert und DoFTP eine Klasse baust. Hilft dir sicherlich auch in anderen Sachen weiter.

Assertor 4. Jan 2010 16:51

Re: Objekte zur laufzeit erstellen und NEUE events zuordnen
 
Hallo DelTurbo,

Zitat:

Zitat von DelTurbo
Ufffffff,

ist das kompliziert. Wenn man sich mal den ASM-Code ansieht schreibt er nur den pointer auf die routine ins objekt (Also Objectadr.+$64). Aber damit man das "sauber" durch den compiler bekommt muss man so einen aufwand treiben??? Das hätte ich nicht gedacht. Kein wunder das ich wie Ochs vorm Berg da stehe.

Ist kein Aufwand, sondern OOP. Das Problem liegt daran, dass Du dem Event eine Prozedur zuweisen willst. Delphi erwartet aber eine Methode, also eine Funktion oder Prozedur einer Klasse. Das kommt daher, dass Klassenmethoden als versteckenten Parameter die Referenz zur Objektklasse selbst mit übergeben: Das ist das bekannte Self.

Dein Beispiel für die Clever Internet Suite müßte nun so aussehen:

Delphi-Quellcode:
unit FTP;

interface

uses
  clTcpClient, clFtp, clCertificateStore, clCertificate,
  ComCtrls, Classes;

type
  TMeineKlasse = class(TObject)
  private
  public
    procedure CheckCert;
    procedure DoFTP(FName:String);
  end;

implementation

uses
  SysUtils, IniFiles;

procedure TMeineKlasse.CheckCert;
begin
  `statement`
end; {CheckCert}

procedure TMeineKlasse.DoFTP(FName:String);
var
  Source: TclFtp;
begin
  Source := TclFtp.Create(nil);
  Source.OnVerifyServer := CheckCert; // jetzt passt das hier, falls die Parameter sonst stimmen
  Source.Free;
end;
Das ganze dann noch mit Konstruktor und Destruktor versehen und die Klasse entsprechend instanzieren. Überlichweise würde man das Source Objekt als Feld der Klasse deklarieren, im Konstruktor das Source Objekt erzeugen und entsprechend im Destruktor freigeben.

Als Tipp für ein gutes Einsteigertutorial zu Methoden in Delphi / ObjectPascal:
http://www.delphi-treff.de/sprachen/...scal/methoden/

Viele Grüße,

Assertor

DelTurbo 4. Jan 2010 17:14

Re: Objekte zur laufzeit erstellen und NEUE events zuordnen
 
Ui,

vielen vielen dank. Damit sollte ich nun zurecht kommen.

Gruss

Suchbegriffe: Objekte zur Laufzeit erstellen event zuordnen ohne Form

himitsu 4. Jan 2010 17:22

Re: Objekte zur laufzeit erstellen und NEUE events zuordnen
 
Zitat:

Zitat von DelTurbo
vielen vielen dank. Damit sollte ich nun zurecht kommen.

ist praktisch das, was ich in #2 schon beschrieben hatte


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:58 Uhr.
Seite 1 von 2  1 2      

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