![]() |
array per message in eigener anwendung versenden
Hallo zusammen,
tut mir (schon fast) leid, Euch wieder mal nerven zu müssen, aber weder Suchfunktion noch Tante Google konnten mir weiterhelfen: Das folgende Konstrukt wurde mir von meinem Vorgänger (Praktikant, wie ich auch) so überlassen und ich soll es nun wieder aufnehmen (wobei ich auch nicht mehr Ahnung habe :oops:). Ich soll / muss / darf ein Array von einem Object aus per Message an ein anderes Object "verschicken", jedoch innerhalb meiner eigenen Anweisung.
Delphi-Quellcode:
const wm_my_notify = wm_user + 1;
type RQueueItem = record Level : Integer; comm : Boolean; BP : Boolean; [...] end; type TAQueue = array of RQueueItem;
Delphi-Quellcode:
type TClassOne = class(TObject)
private FQueue : TAQueue; procedure CreateQueue; public procedure Notify; end; procedure TClassOne.CreateQueue; begin SetLength(FQueue, 100); //Befüllen des FQueue; end; procedure TClassOne.Notify; begin //soll Fqueue per Message versenden SendMessage(classTwo.handle, wm_my_notify, Cardinal(@FQueue), 0); end;
Delphi-Quellcode:
ClassTwo hat per AllocateHwnd ein Handle erhalten.
type TClassTwo = class(TObject)
private FHandle : THandle; FQueue : TAQueue; procedure WndProc(msg : TMessage); public end; procedure TClassTwo.WndProc(msg : Tmessage); var test : Integer; begin if msg.msg = wm_my_notify then test := ((msg.wparam)^ as TAQueue)[0].Level; //funktioniert nicht //??? Zugriff auf Queue-Array end; ClassOne füllt sein FQueue und soll es dann per Message an ClassTwo übertragen. Die Message kommt auf prima an, ich kann auch Integers o.Ä. übertragen (z.B.
Delphi-Quellcode:
funktioniert tadellos und ich kann in ClassTwo auswerten mit
SendMessage(classTwo.handle, wm_my_notify, High(FQueue), 0);
Delphi-Quellcode:
Nur habe ich keine Ahnung, wie ich in ClassTwo wieder auf das Array bzw. dessen Struktur zugreifen soll, also konkret, was in TClassTwo.WndProc zu stehen hat, damit ich das Array verarbeiten kann.
test := msg.wparam
Ich hoffe, ich konnte halbwegs verständlich machen, was mein Problem ist. Wäre dankbar, wenn sich jemand meines Problems annehmen könnte. |
AW: array per message in eigener anwendung versenden
Du sendest nur den Zeiger ... SendMessage kann nunmal nur maximal 2 Integer/Pointer in WPARAM und LPARAM versenden
und den restlichen Speicher (mit dem Arrayinhalt) schickst du nicht rüber. Du könntest via WM_COPYDATA nutzen ... allerdings mußt du da auch den Array-Inhalt und nicht ebenfalls nur den Array-Zeiger verschicken oder du gehst über das Clipboard (aber Achtung, nicht daß du dort einfach so blind die Zwischenablage löschts/überschreibst) Nee, Luckie hat recht |
AW: array per message in eigener anwendung versenden
So lange er innerhalb des eigenen Prozesses bleibt, sollte es kein Problem sein nur den Zeiger zu verschicken. Er behäkt ja seine Gültigkeit. Nur der Empfänger muss eben beachten, dass er nur ein Zeiger auf das erste Element bekommt. Deswegen sollte man noch die Länge des Arrays mitverschicken.
|
AW: array per message in eigener anwendung versenden
stümmt
OK, wenn du nur lesend drauf zugreifen willst, dann müßte es so gehn.
Delphi-Quellcode:
Das nutzt den internen Zeiger des Arrays. Dieses ist aber nur solange gültig/möglich, wie das Array nicht beim Empfänger verändert wird.
SendMessage(classTwo.handle, wm_my_notify, WPARAM(FQueue), 0);
test := TAQueue(msg.wparam)[0].Level; über @ und ^ müßte es eigentlich auch gehn, nur daß man hier einen Zeiger auf die Variable übergibt, wo dann auch Änderungen mäglich wären. Das as ist nur für Objekte (und neuerdings auch für Interfaces) und nicht für "normale" Typen, wie ein Array. |
AW: array per message in eigener anwendung versenden
Und um LPARAM würde ich die Länge mit schicken.
|
AW: array per message in eigener anwendung versenden
Zitat:
Zitat:
Zitat:
Zitat:
|
AW: array per message in eigener anwendung versenden
Zitat:
du kannst auch nur eine bestimmtes Item übergeben:
Delphi-Quellcode:
type PQueueItem = ^RQueueItem;
SendMessage(classTwo.handle, wm_my_notify, WPARAM(@FQueue[0]), 0); test := PQueueItem(msg.wparam)^.Level; // geht auch ohne "^", da Delphi in Fall des nachfolgenden "." sich dieses "^" einfach implizit dahindenkt PS: Laut M$ sollte man besser die Typen WPARAM, LPARAM und RPARAM LRESULT (für's Result) verwenden, statt deinem Cardinal. |
AW: array per message in eigener anwendung versenden
Zitat:
Zitat:
Nochmals danke für Deine / Eure Zeit & Mühe |
AW: array per message in eigener anwendung versenden
Das ist aber kein Problem der Sprache.
Du nutzt hier ja einen Befehl der WinAPI und diese wird in allen Sprachen gleich angesprochen. (heißt also, unter C# würde es genauso aussehn) Bitte. |
AW: array per message in eigener anwendung versenden
Gerade C# ist ein schlechtes Beispiel, wegen dem unmanaged code. Ich hätte eher C oder so als Beispiel genannt. Aber warum eigentlich per SendMessage? Ich hätte ein Ereignos ausgelöst und der Empfänger hätte sich dann das Array selber abgeholt. Und wenn man es noch weiter treiben würde, könnte man aus dem Array eine Liste machen. Und aus den Records Objekte und dann eine ObjectList nehmen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:43 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-2025 by Thomas Breitkreuz