|
Parameterweitergabe von HTML an ActiveX Element
Frage: Ich möchte Parameter an das in der HTML-Seite eingebettete ActiveX Element weitergeben. Ich wäre sehr dankbar, wenn mir jemand eine detaillierte Beschreibung geben könnte.
Antwort: Aus der HTML-Seite heraus kann auf die eigenen Interface-Methoden des
ActiveForm zugegriffen werden, wobei dies auch für die Interface-Methoden des
Events-Interfaces gilt. Das folgende Beispielprojekt demonstriert, wie
- aus der HTML-Datei heraus der Text der TEdit-Instanz im ActiveForm gesetzt
wird.
- in der HTML-Datei auf das Anklicken der TButton-Instanz im ActiveForm
reagiert wird, und
- in der HTML-Datei der neue Inhalt der TEdit-Instanz im ActiveForm
ausgelesen wird
Schritt 1: ActiveForm entwickeln
Nachdem die ActiveX-Bibliothek und das Grundgerüst für das ActiveForm vom
Experten zusammengestellt wurde, werden im Typbibliothekseditor (siehe Abbildung) sowohl das
ActiveForm-Interface als auch das Events-Interface um die eigene Methode
erweitert:
- IActiveFormDemoX: property OSParameter: WideString read Get_OSParameter write Set_OSParameter;
- IActiveFormDemoXEvents: procedure OnOSButtonClick
Das Read/Write-Property OSParameter wird von
Delphi automatisch in die beiden Set_- und Get_-Methoden umgesetzt. Das eigene
Event OnOSButtonClick soll immer dann ausgelöst
werden, wenn der Button im ActiveForm angeklickt wird.
Nach dem Refreshen der Implementierungs-Unit sieht das Ganze so aus, wobei
die neuen Stellen rot hervorgehoben wurden. Dabei muss nur die Zeilen procedure
OSButtonEvent(Sender: TObject); manuell eingefügt werden, die beiden
Methoden für OSParameter hat Delphi angelegt.
type
TActiveFormDemoX = class(TActiveForm, IActiveFormDemoX)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
FEvents: IActiveFormDemoXEvents;
procedure ActivateEvent(Sender: TObject);
procedure ClickEvent(Sender: TObject);
procedure CreateEvent(Sender: TObject);
procedure DblClickEvent(Sender: TObject);
procedure DeactivateEvent(Sender: TObject);
procedure DestroyEvent(Sender: TObject);
procedure KeyPressEvent(Sender: TObject; var Key: Char);
procedure PaintEvent(Sender: TObject);
//
procedure OSButtonEvent(Sender: TObject);
protected
{ Protected-Deklarationen }
procedure DefinePropertyPages(DefinePropertyPage: TDefinePropertyPage); override;
procedure EventSinkChanged(const EventSink: IUnknown); override;
function Get_Active: WordBool; safecall;
function Get_AutoScroll: WordBool; safecall;
function Get_AutoSize: WordBool; safecall;
function Get_AxBorderStyle: TxActiveFormBorderStyle; safecall;
function Get_Caption: WideString; safecall;
function Get_Color: OLE_COLOR; safecall;
function Get_Cursor: Smallint; safecall;
function Get_DoubleBuffered: WordBool; safecall;
function Get_DropTarget: WordBool; safecall;
function Get_Enabled: WordBool; safecall;
function Get_Font: IFontDisp; safecall;
function Get_HelpFile: WideString; safecall;
function Get_KeyPreview: WordBool; safecall;
function Get_PixelsPerInch: Integer; safecall;
function Get_PrintScale: TxPrintScale; safecall;
function Get_Scaled: WordBool; safecall;
function Get_Visible: WordBool; safecall;
function Get_VisibleDockClientCount: Integer; safecall;
procedure _Set_Font(const Value: IFontDisp); safecall;
procedure AboutBox; safecall;
procedure Set_AutoScroll(Value: WordBool); safecall;
procedure Set_AutoSize(Value: WordBool); safecall;
procedure Set_AxBorderStyle(Value: TxActiveFormBorderStyle); safecall;
procedure Set_Caption(const Value: WideString); safecall;
procedure Set_Color(Value: OLE_COLOR); safecall;
procedure Set_Cursor(Value: Smallint); safecall;
procedure Set_DoubleBuffered(Value: WordBool); safecall;
procedure Set_DropTarget(Value: WordBool); safecall;
procedure Set_Enabled(Value: WordBool); safecall;
procedure Set_Font(var Value: IFontDisp); safecall;
procedure Set_HelpFile(const Value: WideString); safecall;
procedure Set_KeyPreview(Value: WordBool); safecall;
procedure Set_PixelsPerInch(Value: Integer); safecall;
procedure Set_PrintScale(Value: TxPrintScale); safecall;
procedure Set_Scaled(Value: WordBool); safecall;
procedure Set_Visible(Value: WordBool); safecall;
function Get_OSParameter: WideString; safecall;
procedure Set_OSParameter(const Value: WideString); safecall;
public
{ Public-Deklarationen }
procedure Initialize; override;
end;
Alle neu deklarierten Methoden müssen nun implementiert werden. Die
Ereignisbehandlungsmethode für das Anklicken der TButton-Instanz im ActiveForm
ruft zuerst ShowMessage auf, um eine Rückmeldung im ActiveForm zu
demonstrieren. Zusätzlich wird das eigene Event aufgerufen, indem indirekt die
Interface-Methode OnOSButtonClick aufgerufen wird.
Die beiden Get_- und Set_-Methode für OSParameter bilden nur die Verbindung
zwischen der TEdit-Instanz im ActiveForm und dem Parameter bzw. dem
Rückgabewert für die Eigenschaft OSParameter des
ActiveForm. Aus der HTML-Datei heraus kann nur auf die Interface-Methoden des
ActiveForm zugegriffen werden, so dass diese beiden Wrapper-Methoden notwendig
sind.
procedure TActiveFormDemoX.Button1Click(Sender: TObject);
begin
ShowMessage('Der Button im ActiveForm wurde angeklickt');
OSButtonEvent(Self);
end;
function TActiveFormDemoX.Get_OSParameter: WideString;
begin
Result := Edit1.Text;
end;
procedure TActiveFormDemoX.Set_OSParameter(const Value: WideString);
begin
Edit1.Text := Value;
end;
procedure TActiveFormDemoX.OSButtonEvent(Sender: TObject);
begin
if FEvents <> nil then
FEvents.OnOSButtonClick;
end;
Nachdem das ActiveForm compiliert wurde, wird der Dialog für die Optionen
für die Distribution über das Web ausgefüllt. Ist das erledigt, kann der Menüpunkt für die Distribution aufgerufen werden. Delphi verpackt die Datei in einer komprimierten CAB-Datei und legt auch das HTML-Grundgerüst an.
Schritt 2: Die vom Experten generierte HTML-Datei erweitern
Alle die Stellen, die von Hand nachgetragen werden müssen, habe ich rot
hervorgehoben:
< HTML>
< H1> Delphi 5 ActiveX Test Page < /H1>< /pre>
< p>
You should see your Delphi 5 forms or controls embedded in the form below.
< HR>< center>< P>
< OBJECT ID="OSActiveForm"
classid="clsid:5D5C9EC6-DB6E-44D1-86A5-E9DE4823C5FC"
codebase="http://localhost/OssiSoft/Test/ActiveFormDemo.cab#version=1,0,1,0"
width=314
height=138
align=center
hspace=0
vspace=0
> < PARAM name="OSParameter" value="Der Text aus der HTML">
< /OBJECT>
< SCRIPT LANGUAGE="JavaScript" FOR="OSActiveForm" EVENT="OnOSButtonClick">
alert(document.all.OSActiveForm.OSParameter);
< /SCRIPT>
< /HTML>
|