Samstag, 11. Oktober 2008

entwickler.com Magazine Konferenzen Akademie Entwickler-Forum Jobbörse Bücher
Software & Support Verlag

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

  1. aus der HTML-Datei heraus der Text der TEdit-Instanz im ActiveForm gesetzt wird.
  2. in der HTML-Datei auf das Anklicken der TButton-Instanz im ActiveForm reagiert wird, und
  3. 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>






Software & Support Verlag GmbH