AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ActiveX SafeArray Sample-code

Ein Thema von Schlingel · begonnen am 27. Jul 2014 · letzter Beitrag vom 11. Sep 2014
Antwort Antwort
Schlingel

Registriert seit: 15. Feb 2003
Ort: Österreich
67 Beiträge
 
Delphi XE2 Professional
 
#1

ActiveX SafeArray Sample-code

  Alt 27. Jul 2014, 13:53
Delphi-Version: XE2
Hallo

Ich muss mich auf einem Projekt mit ActiveX auseinnandersetzten. (visuelle ActiveX in Delphi erstellt)

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
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#2

AW: ActiveX SafeArray Sample-code

  Alt 27. Jul 2014, 14:13
wie sieht denn die entsprechend importierte TLB Datei aus?
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
Schlingel

Registriert seit: 15. Feb 2003
Ort: Österreich
67 Beiträge
 
Delphi XE2 Professional
 
#3

AW: ActiveX SafeArray Sample-code

  Alt 27. Jul 2014, 17:36
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
  Mit Zitat antworten Zitat
Schlingel

Registriert seit: 15. Feb 2003
Ort: Österreich
67 Beiträge
 
Delphi XE2 Professional
 
#4

AW: ActiveX SafeArray Sample-code

  Alt 9. Sep 2014, 08:56
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
Angehängte Dateien
Dateityp: zip AX - Test.zip (9,9 KB, 23x aufgerufen)
  Mit Zitat antworten Zitat
Photoner

Registriert seit: 6. Dez 2012
Ort: Nürnberg
103 Beiträge
 
Delphi 10.1 Berlin Starter
 
#5

AW: ActiveX SafeArray Sample-code

  Alt 11. Sep 2014, 10:31
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

Grüße!
Chris
Chris

Geändert von Photoner (11. Sep 2014 um 10:33 Uhr) Grund: wo bleiben meine Manieren...
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#6

AW: ActiveX SafeArray Sample-code

  Alt 11. Sep 2014, 13:03
Ich schiebe so Streams hin und her. Aber zwischen Delphianwendungen...
  Mit Zitat antworten Zitat
Photoner

Registriert seit: 6. Dez 2012
Ort: Nürnberg
103 Beiträge
 
Delphi 10.1 Berlin Starter
 
#7

AW: ActiveX SafeArray Sample-code

  Alt 11. Sep 2014, 13:55
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)> .....
Chris

Geändert von Photoner (11. Sep 2014 um 14:02 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#8

AW: ActiveX SafeArray Sample-code

  Alt 11. Sep 2014, 14:17
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)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:21 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