![]() |
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:
über "Projekt|Typbibliothek importieren" importiere ich mir meine ActiveX-Form.
..
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; 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:
Wenn ich das Programm starte, dann funktioniert alles wunderbar.
procedure TForm1.FormCreate(Sender: TObject);
begin ActiveFormXOle11.OnChangeEdit2Text := OnChangeEdit2Text; end; procedure TForm1.OnChangeEdit2Text(Sender: TObject; const Param1: WideString); begin Label1.Caption := Param1; end; 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? |
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?
|
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:
Du siehst, es ist keine tlb eingebunden.
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; |
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:
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!
OleObjekt: OleVariant; // standard ole teil
... OleObjekt := OleContainer1.OleObject; OleObjekt.OnChangeEdit2Text := OnChangeEdit2Text; Wie würde das denn mit tlb aussehen? |
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:
Die Procedure Machwas kennt der Compiler ja auch nicht und trotzdem funktioniert es.
OleObjekt: OleVariant; // standard ole teil
... OleObjekt := OleContainer1.OleObject; OleObjekt.Machwas; Aus diesem Grund verstehe ich das mit dem Event nicht. So sieht es mit der tlb aus:
Delphi-Quellcode:
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.
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. |
Re: Ereignis (Event) einer ActiveX-Form ohne tlb zuweisen
Delphi-Quellcode:
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:
OleObjekt := OleContainer1.OleObject;
OleObjekt.Machwas; viel glück weiterhin! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:13 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