Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi ActiveX SafeArray Sample-code (https://www.delphipraxis.net/181229-activex-safearray-sample-code.html)

Schlingel 27. Jul 2014 13:53

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

stoxx 27. Jul 2014 14:13

AW: ActiveX SafeArray Sample-code
 
wie sieht denn die entsprechend importierte TLB Datei aus?

Schlingel 27. Jul 2014 17:36

AW: ActiveX SafeArray Sample-code
 
Zitat:

Zitat von stoxx (Beitrag 1266744)
wie sieht denn die entsprechend importierte TLB Datei aus?

Vermutlich habe ich es missverständlich erklärt...

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

Schlingel 9. Sep 2014 08:56

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

Photoner 11. Sep 2014 10:31

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:
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;
Beim Aufruf muss man dann Data als ByteArray betrachten und das dann auf die Struktur von TMyStruct abbilden:
D.h. Val_1 steckt in den ersten 4 bytes und Val_2 in den übrigen (Achtung 32bit (10byte) unterscheidet sich von 64bit (8byte) ).
http://docwiki.embarcadero.com/RADSt...Einfache_Typen

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:
http://delphi.about.com/library/weekly/aa122104a.htm

Schreib auch bitte ob das funzt. Bei mir kompiliert es zumindest schon mal :-D

Grüße!
Chris

Dejan Vu 11. Sep 2014 13:03

AW: ActiveX SafeArray Sample-code
 
Ich schiebe so Streams hin und her. Aber zwischen Delphianwendungen...

Photoner 11. Sep 2014 13:55

AW: ActiveX SafeArray Sample-code
 
Zitat:

Zitat von Dejan Vu (Beitrag 1272214)
Ich schiebe so Streams hin und her. Aber zwischen Delphianwendungen...

Du willst warscheinlich darauf hinaus, dass man höllisch aufpassen muss damit Sender und Empfänger exakt die gleichen "ByteArrays" erzeugen/erwarten und da gebe ich dir recht.


<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)> .....

Dejan Vu 11. Sep 2014 14:17

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 05:03 Uhr.

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