![]() |
Delphi-Version: XE2
ActiveX SafeArray Sample-code
Hallo
Ich muss mich auf einem Projekt mit ActiveX auseinnandersetzten. (visuelle ActiveX in Delphi erstellt):roll: Das Lesen und beschreiben von einfachen Datentypen (Bool, Dint etc.) ist schon mal kein Problem mehr. - Leider scheitere ich derzeit an Array's und besonderes an notwendigen Zugriff auf Structs.:?: Da ich die bestellte Literatur zu diesem Thema erst in ein/zwei Wochen erhalte wäre meine Bitte ob jemand von euch einen Code-Sample zu dem Thema (ActiveX <-> Structs) vorliegen hat und mir zu Verfügung stellen würde? Die Anwendung ist ein bestehendes Visualisierungs-System in dieses sollen ActiveX mit Zugriff auf Werten einer SPS implementiert werden. (wie oben erwähnt einfache Datentypen sind kein Problem) Danke im voraus für etwaige Hilfestellung |
AW: ActiveX SafeArray Sample-code
wie sieht denn die entsprechend importierte TLB Datei aus?
|
AW: ActiveX SafeArray Sample-code
Zitat:
Die Vorgaben: - Bestehendes Visualisierungs-System eines SPS-Herstellers. (in diesem OCX also ActiveX-Funktionalitäten implementiert werden können.) - Meine Aufgabe ist es nun 2 komplexere Array's of Structs aus einer SPS(OPC-Server) zu lesen, verknüpfen und zu visualisieren bzw. teilweise über Buttons in der AxtiveX-Form zu beschreiben. - Auf jede einzelne Variable des Arrays of Struct zu schreiben bzw. lesen ist kein Problem und funktioniert. Nur ist es bei derzeit knapp 200 Stellplätzen und pro Stellplatz aktuell ~8 benötigten Variablen so nicht umzusetzen. - Daher wäre mein Ansatz auf die zwei Array's(of Structs [DINT, BOOL, String]) direkt zuzugreifen und die komplette Verknüpfung/Visualisierung in Delphi umzusetzen. Ich denke ein Source Beispiel wie die Typ-Deklarierung (SafeArray(long) oder VariantArray) aussehen muss damit ich im ...Get/Set auf diese zugreifen kann, wie eben auf eine einzelne einfache Variable. Aktuell erzeuge ich lediglich eine "property", benenne diese und wähle den Typ: BRST, Long, Bool und lege für das schreiben das binding fest. Somit kann ich im Get/Set relativ easy Variablen lesen und schreiben.... Grüsse |
AW: ActiveX SafeArray Sample-code
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo
Zwischenzeitlich habe ich mir von Alexander Kosch das Buch COM/DCOM (ca.900 Seiten) zugelegt und durchgekaut. Habe zwar einiges neues gelernt, trotzdem habe ich für mein Problem auch mit diesem sehr umfangreichem Hilfsmittel/Beispielen auf der CD keinen wirklichen zündenden Ansatz für mein Problem gefunden... Im Anhang habe ich ein Beispiel was schon funtioniert (Integer und String) zwischen dem ActiveX und der PLC austauschen geht reibungslos.... Aber es ist mühsam 50 oder mehr dieser einfachen Variablen zu übertragen. Daher wäre mein Ansinnen eben über Arrays, Structs/Records zu kommunizieren. Hierbei finde ich nur Beispiel-Code wo dies mittels Methoden erreicht wird. Ich bin aber auf dem (falschen?) Weg dies über Eigenschaften bzw. Propertys zu erreichen weil dies mit "einfachen Variablen" ja problemlos läuft. Ich hoffe irgendjemand hat Erfahrung auf diesem Gebiet und kann mir hier weiterhelfen (eventl. mit Delphi oder sonstiegen Code-Beispiel) Danke |
AW: ActiveX SafeArray Sample-code
Schwieriges Thema. Bin noch nicht erfahren genug dafür, aber wie wäre es mit folgender Idee:
Delphi-Quellcode:
type
TMyStruct = record Val_1 : Integer; Val_2 : Extended; end;
Delphi-Quellcode:
protected
procedure Get_MyArray(var Data : OleVariant); safecall;
Delphi-Quellcode:
Beim Aufruf muss man dann Data als ByteArray betrachten und das dann auf die Struktur von TMyStruct abbilden:
procedure TA0001.Get_MyArray(var Data: OleVariant);
var MStream : TMemoryStream; Address : Pointer; MyStruct : TMyStruct; begin MStream := TMemoryStream.Create; try //Vorbereiten MyStruct.Val_1 := Random(100); MyStruct.Val_2 := Random(); MStream.SetSize(SizeOf(TMyStruct)); MStream.Position := 0; MStream.Write(MyStruct,SizeOf(TMyStruct)); //VariantArray Data := VarArrayCreate([0,MStream.Size-1],varByte); Address := VarArrayLock(Data); MStream.Position := 0; MStream.Read(Address^,MStream.Size); finally VarArrayUnlock(Data); MStream.Free; end; end; D.h. Val_1 steckt in den ersten 4 bytes und Val_2 in den übrigen (Achtung 32bit (10byte) unterscheidet sich von 64bit (8byte) ). ![]() Schreiben sollte auch in der Art (Die Arrays als EIN ByteArray an dein ActiveX Element übergeben) möglich sein. Deine Schnittstelle muss dann nur die Größe des ByteArrays auswerten ( durch die Größe eines Records teilen) und die Anzahl in ein RecordArray schreiben. Habe das selber benutzt um ein Bitmap mit 25 MByte prozessübergreifend zu übertragen (one way server to client). Das ging zumindest sehr flott. Folgender Link könnte dir noch hilfreich sein: ![]() Schreib auch bitte ob das funzt. Bei mir kompiliert es zumindest schon mal :-D Grüße! Chris |
AW: ActiveX SafeArray Sample-code
Ich schiebe so Streams hin und her. Aber zwischen Delphianwendungen...
|
AW: ActiveX SafeArray Sample-code
Zitat:
<4 byte Val_1 {Struct_1} (Integer in Delphi)> <8 byte Val_2 {Struct_1} (Extended in Delphi 64bit)> <4 byte Val_1 {Struct_2} (Integer in Delphi)> <8 byte Val_2 {Struct_2} (Extended in Delphi 64bit)> ..... |
AW: ActiveX SafeArray Sample-code
Na klar, gut das Du das erwähnst (wobei der Hinweis nicht meine Intention war). Mir ging es nur darum, die Richtigkeit deines Codes im Prinzip zu belegen (Array -> Variant -> Array)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:29 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 by Thomas Breitkreuz