Delphi-PRAXiS

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 15: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 15: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 15: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 15: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 15: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 16: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 16: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 17: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 18: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 18: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

DelTurbo 4. Jan 2010 18:35

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

Zitat von himitsu
Zitat:

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

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

Mag sein. Aber da ich Delphi anfänger bin, brauche ich immer was greifbares. Da bin ich glücklich über jeden codesnipsel. Im grunde weiss ich ja immer was ich möchte. Aber wenn einem die Syntax fehlt ist man echt froh so ein post zu bekommen.

Trotzdem vielen dank.....

DelTurbo 6. Jan 2010 18:10

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

ich habe noch eine frage zu objecten die zur laufzeit erstellt werden. Wenn ich ein objekt erstelle, wie sind dann die defaultwerte? Oder werden garkeine eingetragen?

Wenn doch, sind es die werte die man hat, als wenn man das object neu auf Form1 legt?

Wenn nicht, wie kann ich die defaultwerte zuordnen? Also wenn man es auf Form1 zieht sind ja diverse werte gesetzt. Wie bekomme ich die in mein object, das ich mit .Create erstellt habe? Muss man das "zu fuss" machen?

Danke im voraus

himitsu 6. Jan 2010 18:56

Re: Objekte zur laufzeit erstellen und NEUE events zuordnen
 
Defaultwerte?

Der Speicher für die Klasse wird mit NULLEN initialisiert ... genauso wie es bei globalen Variablen passiert.

DelTurbo 7. Jan 2010 11:11

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

war wohl zu allgemein gehalten meine frage. Sagen wir mal ich ziehe IdFTP auf die Form. Dann ist z.b. Port 21 voreingetragen. Oder bei clFtp.

Nun war die frage ob ein z.b. clftp.Create oder IdFtp.Create auch beispielsweise den port 21 schon vorbelegt.

Das mit dem Port ist nur ein beispiel. Es gibt ja noch mehr sachen.

Alaitoc 7. Jan 2010 11:35

Re: Objekte zur laufzeit erstellen und NEUE events zuordnen
 
Einige Properties haben einen Default-Wert und dazu sollte auch dein Beispiel mit dem Port zählen. Also ja.
Die Defaultwerte sind in der jeweiligen Klasse definiert und sind identisch mit denen die definiert sind
wenn man z.b. eine Komponente aufs Formular zieht.

Falls du noch weitere Fragen haben solltest, soweit ich mich erinne...pro Thema einen Thread.
Und zur Laufzeit erstellten Objekten ein Event zuweisen sollte ja abgehakt sein ;)

MfG Alaitoc

DelTurbo 7. Jan 2010 11:42

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

Zitat von Alaitoc
Also ja.

Das reicht mir als antwort. Ich wollte nicht extra einen Thread erstellen, weil es ja nur eine frage war und sich im grunde ja auf das erstellen zur laufzeit bezieht.

Vielen dank......


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:03 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 by Thomas Breitkreuz