Announcement

Collapse
No announcement yet.

OCX zur Runtime laden, OCX soll VarNameListe liefern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • OCX zur Runtime laden, OCX soll VarNameListe liefern

    Nach langen probieren und durchwühlen der Delphi-VCL habe ich herausgefunden, wie man zur Laufzeit ein OCX laden kann, ist eigentlich ganz einfach, wie alles wenn mans weiss:<p>
    kleine Demo:<br>
    type<br>
    TACXObj = record<br>
    GUID :TGUID;<br>
    Left :Integer;<br>
    Top :Integer;<br>
    Width :Integer;<br>
    Height :Integer;<br>
    end;<br>

    TWinData = record<br>
    ACXCount :Integer;<br>
    ACXObjects :Array of TACXObj;<br>
    end;<br>

    TAXC = class(TOleControl)<br>
    protected<br>
    procedure InitControlData; override;<br>
    end;<br>

    var<br>
    WinData : Array of TWinData; //Fensterdaten<br>
    ClassID : TGUID; //aktuelle GUID<br>

    procedure TAXC.InitControlData;<br>
    var<br>
    CControlData: PControlData;<br>
    begin<br>
    New(CControlData);<br>
    with CControlData^ do begin<br>
    ClassID:= WDemo.ClassID;<br>
    EventIID:= StringToGUID('{00000000-0000-0000-0000-000000000000}');<br>
    EventCount:= 0;<br>
    EventDispIDs:= nil;<br>
    LicenseKey:= nil;<br>
    Flags:= 0;<br>
    Version:= 0;<br>
    FontCount:= 0;<br>
    FontIDs:= nil;<br>
    PictureCount:= 0;<br>
    PictureIDs:= nil;<br>
    Reserved:= 0;<br>
    InstanceCount:= 0;<br>
    EnumPropDescs:= nil;<br>
    end;<br>
    ControlData := CControlData;<br>
    end;<br>

    procedure WDemo.ShowACX;<br>
    var<br>
    n:Integer;<br>
    begin<br>
    //alle ACX zum Fenster zugehörig öffnen...<br>
    if WinData[WinDataPos].ACXCount>-1 then<br>
    for n:=0 to WinData[WinDataPos].ACXCount do begin<br>
    ClassID:=WinData[WinDataPos].ACXObjects[n].GUID;<br>
    ACX1:=TAXC.Create(ParentWindow);<br>
    ACX1.Parent:=ParentWindow;<br>
    ACX1.Left:=WinData[WinDataPos].ACXObjects[n].Left;<br>
    ACX1.Top:=WinData[WinDataPos].ACXObjects[n].Top;<br>
    ACX1.DataPos:=n;<br>
    ACX1.TypeInfo:=GetTypeInfoForGUID(ClassID);<br>
    end;<br>
    end;<p>

    Das Wichtigste ist die "ControlData" zu füttern. Delphi macht es übrigens ebenso.<br>
    Um jetzt die OCX zu beeinflussen, benötigt man die VarNamen, um über die DispID die Werte zu ändern. Auch das habe ich geschaft, allerdings mit riesigen Aufwand. Ich hangel mich dabei von VTable zu VTable und muß alles einzeln abfragen. Frage: Geht das auch einfacher? Denn ich habe doch schon das TOleControl und auch das OCX mit "pdisp:=ACX.OleObject as IDispatch;". Wenn jemand eine einfache Methode kennt, wäre ich Dankbar. Wenn jemand den Code von meiner umständlichen Lösung haben will, bitte melden ([email protected]).
Working...
X