Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Eigene Nachricht mit Parameterübergabe (https://www.delphipraxis.net/95032-eigene-nachricht-mit-parameteruebergabe.html)

TheMiller 29. Jun 2007 15:34


Eigene Nachricht mit Parameterübergabe
 
Hallo,

ich hatte ja in einem anderen Thread schon mal über Messages geschrieben. Das Senden klappt auch eigentlich ganz gut. Jetzt wollte ich nurmal wissen, ob man an eigene Messages auch einen selbstdefinierten Parameter übergeben kann. Ich müsste nämlich wissen, von wo die Message kommt, bzw wie die Datei heißt, die mir die Message gesendet hat!

Danke!

DGL-luke 29. Jun 2007 15:44

Re: Eigene Nachricht mit Parameterübergabe
 
sowas würde ich immer mit WM_COPYDATA machen. Die WinAPI öffnet damit einen Speicherbereich des Senders für den Empfänger, aus dem dann gelesen werden kann.

Das geht afaik nicht mit anderen, selbst definierten Messages.

EDIT: Wenn du die Messages in deinem eigenen Prozess verschickst, gehts natürlich so, wies Nuclear-Ping unten beschreibt.

Nuclear-Ping 29. Jun 2007 15:44

Re: Eigene Nachricht mit Parameterübergabe
 
Du musst einen eigenen Record definieren, daraus einen Pointer machen, Speicher reservieren und als LParam die Adresse des Pointers übergeben.

Hier mal ein Beispiel aus einem aktuellen Projekt:
Delphi-Quellcode:
type
  TOscDrawInfo = record
                   Buffer: PChar;
                   Size: Integer;
                   OscRight, OscLeft: TBitmap;
                   LW, LH, RW, RH: Integer;
                   ScannerOsc: Boolean
                 end;
  POscDrawInfo = ^TOscDrawInfo;

{...}

procedure DrawOscilloscope (Buffer: PChar; Size: Integer;
                            OscRight, OscLeft: TBitmap;
                            LW, LH, RW, RH: Integer;
                            ScannerOsc: Boolean);
var
  OscDrawInfo: POscDrawInfo;
begin
  New (OscDrawInfo);
  GetMem (OscDrawInfo^.Buffer, Size);

  CopyMemory (OscDrawInfo^.Buffer, Buffer, Size);
 
  OscDrawInfo^.Size := Size;
  OscDrawInfo^.OscRight := OscRight;
  OscDrawInfo^.OscLeft := OscLeft;
  OscDrawInfo^.LW := LW;
  OscDrawInfo^.LH := LH;
  OscDrawInfo^.RW := RW;
  OscDrawInfo^.RH := RH;
  OscDrawInfo^.ScannerOsc := ScannerOsc;

  PostMessage (RadionicMainContainerForm.Handle,
               WM_USER, MSG_DRAW_OSCILLOSCOPE, Integer (OscDrawInfo));
end;
Nicht vergessen, den Speicher dann in der Empfangsroutine wieder freizugeben. ;)

DGL-luke 29. Jun 2007 15:46

Re: Eigene Nachricht mit Parameterübergabe
 
Zitat:

Zitat von Nuclear-Ping
Nicht vergessen, den Speicher dann in der Empfangsroutine wieder freizugeben. ;)

Innerhalb des eigenen Prozesses ja, ansonsten wirds ordentlich knallen.

Nuclear-Ping 29. Jun 2007 15:50

Re: Eigene Nachricht mit Parameterübergabe
 
Ja, sonst mit WM_COPYDATA. Dafür hab ich aber grad kein Beispiel. :P

TheMiller 30. Jun 2007 00:29

Re: Eigene Nachricht mit Parameterübergabe
 
Danke an euch alle!

Das ist ja eigentlich ganz easy. Mit dem record-Pointer-Prinzip habe ich bereits Erfahrung... Dann werde ich mal ein bissl rumprobieren!

Gute Nacht!

Luckie 30. Jun 2007 01:34

Re: Eigene Nachricht mit Parameterübergabe
 
Guck mal hier: http://www.michael-puff.de/Developer.../Code-Snippets -> WM_COPYDATA

Innerhalb des eigenens Prozesses kannst du auch selbst definierte Nachrichten verschicken mit einem Zeiger auf einen Speicherbereich im lParam.

TheMiller 30. Jun 2007 09:26

Re: Eigene Nachricht mit Parameterübergabe
 
Das ist genau das, was ich gesucht habe! Nur ich hab mal eine Frage. Wo ist der Unterschied zwischen einem Record und einem packed Record.

Reinhard Kern 30. Jun 2007 09:42

Re: Eigene Nachricht mit Parameterübergabe
 
Zitat:

Zitat von DJ-SPM
Das ist genau das, was ich gesucht habe! Nur ich hab mal eine Frage. Wo ist der Unterschied zwischen einem Record und einem packed Record.

Hallo

nur bei einem packed record kannst du dich drauf verlassen, dass die Daten dicht an dicht gepackt sind, z.B. bei
Delphi-Quellcode:
test = record
         int1 : integer;
         byte1 : byte;
         int2 : integer;
       end;
wird für byte1 der gleiche Speicherplatz reserviert wie für int1 und int2, damit die Daten im 32bit-Speicher ausgerichtet sind (bei 64bit wird an 64-bit-Grenzen ausgerichtet). Das gibt häufig Ärger, wenn du den Record mit anderen Programmen austauschst oder in eine Datenbank schreiben willst. Bei "packed" nimmt das byte auch nur ein byte ein.

Im Zweifel kannst/musst du das mit SizeOf prüfen: test ist 12 byte gross, als packed 9 byte.

Gruss Reinhard

TheMiller 30. Jun 2007 09:45

Re: Eigene Nachricht mit Parameterübergabe
 
Also kann man sagen, dass nur noch packed-records verwendet werden sollten?


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:04 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