Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi ActiveX einbinden (https://www.delphipraxis.net/11050-activex-einbinden.html)

Praktikant 30. Okt 2003 11:03


ActiveX einbinden
 
Folgendes Problem:
ich habe ein fertiges ActiveX Programm welches ich schon über activex importieren installiert habe.

Aber wie kann ich auf das activex zugreifen? Es ist kein symbol in der Palette dazugekommen, bei compilieren passiert auch nichts.

Auszug auf Code den ich in einem Fenster habe (so eine art formular, nur ohne das Formular :gruebel: )
Delphi-Quellcode:
 
...
    _S5 = interface(IDispatch)
    ['{74C143B6-E5EE-4345-B9BF-0C511DBE9DD1}']
    function Get_Tzeit: Double; safecall;
    procedure Set_Tzeit(Tzeit: Double); safecall;
    function Get_belegt: WordBool; safecall;
    procedure Set_belegt(belegt: WordBool); safecall;
    function Get_dbinia1: WideString; safecall;
    procedure Set_dbinia1(const dbinia1: WideString); safecall;
    function Get_dbinia2: WideString; safecall;
    procedure Set_dbinia2(const dbinia2: WideString); safecall;
    function ag_comini(var comport: WideString; var comstr: WideString): WordBool; safecall;
    function ag_comout: OleVariant; safecall;
    ...
Wie kann ich jetzt aus einem Formular heraus auf zB. ag_comini zugreifen?

Muss ich immer dem project mein activex hinzufügen, oder wie bindet man activex ein???

Sanchez 30. Okt 2003 14:10

Re: ActiveX einbinden
 
Liste der Anhänge anzeigen (Anzahl: 1)
hi,

Ich weiss jetzt nicht was der beste Weg ist, aber ich hab sowas ähnliches so gelöst:

Suche im Code (Typelibrary) von deinem ActiveX nach sowas ähnlichen:

Delphi-Quellcode:
ClassID: '{591091BD-DF3E-4C2A-B91F-C29559D04590}';
Die CLSID (in den geschwungenen Klammern) wird bei dir einen anderen Wert haben. Nach dem suchst du in der Registry. Dort suchst du nach einen Eintrag so ähnlich wie das Bild im Anhang. Der Text im roten Kästchen ist der Klassenname meiner ActiveX-Kompo.

Du machst eine Variable vom Typ Variant
Delphi-Quellcode:
..
ActiveXVariable  : Variant;
..
So kreierst du den Objekt (das S7TCPIP.S7TCP ist der Klassenname den du in der Registry findest)

Delphi-Quellcode:
  ActiveXVariable := CreateOleObject('S7TCPIP.S7TCP')
So gibst du es wieder frei
Delphi-Quellcode:
  ActiveXVariable := Unassigned;
Dazwischen kannst du dein Objekt ganz normal verwenden, allerdings gibts auf diesem Weg keine Typprüfung und auch keine Codevervollständigung. Es gibt noch einen anderen Weg, bei dem du diese Vorteile wieder hast, aber den hab ich leider nicht zu laufen bekommen.

BTW: Gehe ich recht in der Annahme, dass du auf S5-SPS zugreifen willst? Ich arbeite gerade an einer Kompo zur Kommuniktion mit einer S7 und bin soweit, dass ich mit der SPS kommunizieren kann, aber die Werte noch nicht richtig auslese.

Praktikant 30. Okt 2003 14:43

Re: ActiveX einbinden
 
super, vielen dank!

Wie soll man auch darauf kommen - ohne irgend eine Dokumentation...

Du hast richtig getippt, soll eine Kommunikation mit einer S5 sein, mit einem fertigen activex Baustein.
Das Problem ist dass nur eine kurze Beschreibung für vidualbasic vorhanden ist, und da kann ich gar nicht damit anfangen - bzw. hat es da den Anschein dass so was wie eine Komponente erzeugt wird, die man aus der Palette heraus ins Formular setzen kann, doch da geschieht bei delphi nach dem installieren gar nichts in der Richtung.

Tjo, jetzt versuche ich es mal mit Deinen Tipps, hoffe das es klappt.
Habe auch schon eine S7 Verbindung (über eine dll) zustande gebracht. Bei den Werten musst Du beachten das wenn Du ein word ausliest zuerst das niederwertige und dann das höherwertige ausgegeben wird (somit sind die ersten 8 Bits mit den letzten 8 vertauscht).

Sanchez 30. Okt 2003 14:49

Re: ActiveX einbinden
 
Double-Werte kann ich schon auslesen, war ne schwere Geburt. Booleans hab ich noch nicht geschafft, das liegt aber mehr daran, dass ich keine Ahnung von dem Ding habe und es nicht schaffe einen Booleanausgang zu setzen.

Praktikant 30. Okt 2003 15:13

Re: ActiveX einbinden
 
hab auch absolut keinen Plan von einer SPS, liefert die nicht immer nur einen dezimalen Wert?
Ich habe eine inttobin Wandlung vorgenommen wenn ich die einzelnen bits benötige.

Sanchez 30. Okt 2003 16:18

Re: ActiveX einbinden
 
nö wenn ich nen Ausgang, der als float definiert ist abfrage liefert er mir nen 4 byte Fliesskommawert

Praktikant 31. Okt 2003 09:27

Re: ActiveX einbinden
 
Problem:
Habe die registry durchsucht und das einzige was halbwegs ähnelte hatte den Wert "S5".

Wenn ich nun die von Dir gennanten Befehlszeilen reinschreibe und das Programm starte kommt zu Laufzeit die Fehlermeldung "Ungültige Klassenzeichenfolge".

Ist nun mein Klassenname der falsche?! Die anderen Werte in der Class ID sahen selber aber aus wie eine class ID.

Und nu meine Frage: :wiejetzt:

Sanchez 31. Okt 2003 09:33

Re: ActiveX einbinden
 
Du kannst natürlich nicht den Klassennamen verwenden den ich oben geschrieben habe, dass ist der für das ActiveX, dass ich benutze.

Der Teil, in dem ich meine ClassID gefunden hab sieht so aus:

Delphi-Quellcode:
procedure TS7TCP.InitControlData;
const
  CControlData: TControlData2 = (
    ClassID: '[color=#ff002d]{591091BD-DF3E-4C2A-B91F-C29559D04590}[/color]';
    EventIID: '';
    EventCount: 0;
    EventDispIDs: nil;
    LicenseKey: nil (*HR:$80040111*);
    Flags: $00000000;
    Version: 401);
begin
  ControlData := @CControlData;
end;
Den Klassennamen gabs dann in der Registry unter: HKLM\Software\Classes\CLSID\{591091BD-DF3E-4C2A-B91F-C29559D04590}

Praktikant 31. Okt 2003 09:47

Re: ActiveX einbinden
 
habe mich schlecht ausgedrückt. habe natürlich nicht deine Adressen verwendet, sondern mit Befehlszeilen meinte ich
ActiveXVariable := CreateOleObject('S7TCPIP.S7TCP') und
ActiveXVariable := Unassigned;

Bin nun so einem Querverweis in der registry gefolgt und es scheint ich habe die richtige Klassennummer (oder was auch immer :wink: ) gefunden.

Nach meinem CreatOLE kann ich nun auf das von mir anfangs genannte ag_comini usw. zugreifen?!

Mir ist aber nicht klar wie. Muss ich das S5-ActiveX Objekt einbinden?

Sanchez 31. Okt 2003 09:57

Re: ActiveX einbinden
 
Nein, musst du nicht einbinden.

Nachdem deine ActiveXVariable erzeugt wurde kannst du die Funktionen aus der TLB ganz normal aufrufen. Nur hast eben keine Typprüfung oder Codevervollständigung
Delphi-Quellcode:
  ActiveXVariable := CreateOleObject('S7TCPIP.S7TCP')
  ActiveXVariable.ag_comini(...);


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:15 Uhr.
Seite 1 von 2  1 2      

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