Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Ereignis (Event) einer ActiveX-Form ohne tlb zuweisen (https://www.delphipraxis.net/12425-ereignis-event-einer-activex-form-ohne-tlb-zuweisen.html)

LuckySpacy 27. Nov 2003 09:34


Ereignis (Event) einer ActiveX-Form ohne tlb zuweisen
 
Folgendes Problem:
Ich habe eine ActiveX-Form erstellt.
Auf diesem Activex-Form befindet sich eine Edit-Komponente und ein Button.
Sobald ich auf den Button drücke, soll über ein Ereignis der Inhalt des Edit-Textes
nach außen übergeben werden.


Beispiel 1:

In der ActiveX-Form sieht es folgendermaßen aus:
Delphi-Quellcode:
..
  private
    { Private-Deklarationen }
    FEvents: IActiveFormXOle1Events;
    procedure ChangeEdit2Text(Sender: TObject; const Edit2Text: WideString);
..

procedure TActiveFormXOle1.ChangeEdit2Text(Sender: TObject;
  const Param1: WideString);
begin
  if FEvents <> nil then
    FEvents.OnChangeEdit2Text(Param1);
end;

procedure TActiveFormXOle1.Button1Click(Sender: TObject);
begin
  ChangeEdit2Text(Sender, Edit2.Text);
end;
über "Projekt|Typbibliothek importieren" importiere ich mir meine ActiveX-Form.
Dann erstelle ich mir eine neue Anwendung;
Auf die Anwendung setze ich meine importierte Activex-Form und ein Label;

Der Quelltext meiner Anwendung sieht unter anderem so aus:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ActiveFormXOle11.OnChangeEdit2Text := OnChangeEdit2Text;
end;

procedure TForm1.OnChangeEdit2Text(Sender: TObject;
  const Param1: WideString);
begin
  Label1.Caption := Param1;
end;
Wenn ich das Programm starte, dann funktioniert alles wunderbar.
Die Label-Komponente auf meiner Anwendung bekommt den Inhalt des Textes meiner ActiveX-Form Edit-Komponente
zugewiesen, sobald ich auf den Button drücke.


Beispiel 2:

Jetzt möchte ich aber nicht die tlb verwenden.
Das ActiveX soll in meiner Anwendung angezeigt werden.
Dazu verwende ich den OleContainer.

Mein Quelltext hierzu sieht wie folgt aus:

Delphi-Quellcode:
..
  private
    OleObjekt: OleVariant;
..


procedure TForm1.rbtActiveFormXClick(Sender: TObject);
begin
  OleContainer1.CreateObject('ActiveFormXOle1Proj1.ActiveFormXOle1', false); // in den Container laden
  OleContainer1.DoVerb(ovShow);                                             // Anzeigen
  OleObjekt := OleContainer1.OleObject;                                     // OleObjekt zuweisen
  OleObjekt.OnChangeEdit2Text := OnChangeEdit2Text;                         // Event wie im ersten Beispiel zuweisen
end;

Wenn ich dies jetzt Kompiliere, dann bekomme ich folgende Fehlermeldung:
"Nicht genügend wirkliche Parameter"

Wenn ich das tue, was der Compiler von mir verlangt
"OleObjekt.OnChangeEdit2Text := OnChangeEdit2Text(Sender, 'Hallo');"
meckert der Compiler auch nicht mehr rum.
Nützt aber nichts, weil es in der Anwendung nicht funktionert.


Zusammengefasst:
Ich benutze in beiden Beispielen das selbe ActiveX.

Der Unterschied zwischen den beiden Versionen ist:
Im ersten Beispiel benutze ich die tlb und im zweiten Beispiel nicht.

Frage:
Wieso kann ich das Event nicht zuweisen ?
Ich verstehe es einfach nicht.
Was muss ich tun, damit es funktioniert?

maximov 27. Nov 2003 10:15

Re: Ereignis (Event) einer ActiveX-Form ohne tlb zuweisen
 
Wenn du keine tlb benutzt, woher soll der compiler wissen wo/wie/welcher parameter der handler braucht? ...Ist die tlb nicht intern in der activeX-compo als resource angehängt?

LuckySpacy 27. Nov 2003 11:49

Re: Ereignis (Event) einer ActiveX-Form ohne tlb zuweisen
 
Ich habe jetzt die Frage nicht richtig verstanden.
Ich poste einfach mal die gesamte Anwendung:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtnrs, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    OleContainer1: TOleContainer;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    OleObjekt: OleVariant;
    procedure OnChangeEdit2Text(Sender: TObject;
      const Param1: WideString);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  OleContainer1.CreateObject('ActiveFormXOle1Proj1.ActiveFormXOle1', false);
  OleContainer1.DoVerb(ovShow);
  OleObjekt := OleContainer1.OleObject;
  OleObjekt.OnChangeEdit2Text := OnChangeEdit2Text;
end;

procedure TForm1.OnChangeEdit2Text(Sender: TObject;
  const Param1: WideString);
begin
  Label1.Caption := Param1;
end;
Du siehst, es ist keine tlb eingebunden.

maximov 27. Nov 2003 13:41

Re: Ereignis (Event) einer ActiveX-Form ohne tlb zuweisen
 
So gut kenn ich mich damit auch nicht aus, aber mir fällt folgendes auf:

Delphi-Quellcode:
OleObjekt: OleVariant; // standard ole teil
...
OleObjekt := OleContainer1.OleObject;
OleObjekt.OnChangeEdit2Text := OnChangeEdit2Text;
woher soll das OleObject dein event kennen, wenn du nicht das richtige interface am wickel hast? Das com-object wird ja erst zur laufzeit aufgelöst!

Wie würde das denn mit tlb aussehen?

LuckySpacy 27. Nov 2003 16:03

Re: Ereignis (Event) einer ActiveX-Form ohne tlb zuweisen
 
Der Compiler kann das Event gar nicht kennen.
Das ist auch richtig so. Erst wenn das ActiveX geladen wird stehen diese Events, Funktionen oder Proceduren zur Verfügung.
Der Compiler weiß das und meckert es auch nicht an.
Zum Beispiel funktioniert so etwas ja auch einwandfrei.

Delphi-Quellcode:
OleObjekt: OleVariant; // standard ole teil
...
OleObjekt := OleContainer1.OleObject;
OleObjekt.Machwas;
Die Procedure Machwas kennt der Compiler ja auch nicht und trotzdem funktioniert es.
Aus diesem Grund verstehe ich das mit dem Event nicht.

So sieht es mit der tlb aus:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, ActiveFormXOle1Proj1_TLB;

type
  TForm1 = class(TForm)
    ActiveFormXOle11: TActiveFormXOle1;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    procedure OnChangeEdit2Text(Sender: TObject;
      const Param1: WideString);
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  ActiveFormXOle11.OnChangeEdit2Text := OnChangeEdit2Text;
end;



procedure TForm1.OnChangeEdit2Text(Sender: TObject;
  const Param1: WideString);
begin
  Label1.Caption := Param1;
end;


end.
Sobald ich auf den Button im ActiveX-Form drücke wird der Inhalt der Edit-Komponente aus der ActiveX-Form an das Label in der Anwendung übergeben.

maximov 27. Nov 2003 18:32

Re: Ereignis (Event) einer ActiveX-Form ohne tlb zuweisen
 
Delphi-Quellcode:
OleObjekt := OleContainer1.OleObject;
OleObjekt.Machwas;
Im ernst. War mir nicht klar...is das die vielzitierte ole-automation? ...ich dachte das verhält sich genau wie bei COM, wovon ole ja abstammt! Naja, dann streich meine fragen von oben :wink:

viel glück weiterhin!


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:23 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