Autor Beitrag
Moritz M.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1672



BeitragVerfasst: Mi 23.10.02 14:23 
Hi

Ich habe im Forum nach sendmessage gesucht, einige Beiträge gefunden, die mir leider alle nicht weiterhielfen. :(
Nun Frage Ich das mal:
Welchen Code brauche ich, um, sobald eine msg ankommt, dieses anzuzeigen?


cu

Onz
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mi 23.10.02 16:29 
Ich hab leider keine Ahnung wie der Prozedurtyp genannt wirt, ich nenne es Messageprozedur. Ob das eine richtige Bezeichnung ist weiss ich allerdings nicht.

Zuerst ein wenig Code:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.WMSysCommand;
begin
  if (Msg.CmdType = SC_MINIMIZE) then begin
    ShowMessage('Das Fenster wird nun minimiert');
  end;
  if (Msg.CmdType = SC_MAXIMIZE) then begin
    ShowMessage('Das Fenster wird nun maximiert');
  end;
  inherited;
end;


Wichtig ist diese Zeile

ausblenden Quelltext
1:
procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;					


Diese Prozedur fängt alle Messages die an das Formular gesendet werden. Zusamengesetzt ist die aus:

WMSysCommand - Auch wenn der Name jetzt wichtig aussieht, so ist es nut eine Bezeichnung. Es wird meistens eine Bezeichnung gewählt die der Message ähnlich ist. Ist aber kein Muß.

(var Msg: TWMSysCommand) - Parameter und sehr wichtig. Mit der Message werden Parameter mitgeschickt. Es handelt sich hier um eine Recordvariable die mehrere Werte enthalten kann. Vor der Variable muß das VAR stehen. Dadurch ist es Möglich die Werte zu überschreiben. Abhängig von der Message ist auch der Variablentyp. Was für ein Typ es sein soll steht meistens in der Hilfe dabei. Bei selbstdefinierten Messages kann die TMessage genommen werden.

message WM_SYSCOMMAND - Die Message. Es gibt Listen mit allen Messages und deren bedeutung. Stehen irgendwo in der API. Ist eingentlich eine Konstante für ein Integerwert. Man kann auch eine eigene Message definieren.
Moritz M. Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1672



BeitragVerfasst: Mi 23.10.02 16:50 
Werds so mal probieren

cu

Onz
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Mi 23.10.02 17:41 
Popov hat folgendes geschrieben:
Ich hab leider keine Ahnung wie der Prozedurtyp genannt wirt

Hinter message Xyz; stecken dynamische Methoden, die dieselben Eigenschaften wie virtuelle Methoden besitzen. Nur verbrauchen dynamische Methoden weniger Speicherplatz als virtuelle, sind jedoch im Aufruf um einiges langsamer als virtuelle Methoden, da zuerst in der DMT (dynamic method list) die passende ID (Xyz) gefunden werden muss, wobei auch die DMTs der Vorfahrklassen durchsucht werden müssen (die VMT enthält auch die virtuellen Methoden der Vorfahrklassen, was den Speicherverbrauch bewirkt). Zur Geschwindigkeitsoptimierung wurde ein kleiner "Cache" eingebaut, der die ID=>Adresse Zuweisung der zuletzt aufgerufenen dynamische Methode zwischenspeichert.

Das Message-System der VCL kann durch das Vorhandensein der DMT, in der ja für jede dynamische Methode ein ID=>Adresse Eintrag vorhanden ist, diese ID=>Adresse Zuweisung für die Botschaften leicht misbrauchen, weil eine Botschaft auch eine ID, nämlich Message.Msg, enthält.

_________________
Ist Zeit wirklich Geld?
Moritz M. Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1672



BeitragVerfasst: Mi 23.10.02 18:45 
Hi

Noch eine Frage:
Wie kann Ich verschickte Strings empfangen
Es wird so versendet:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
...

const 
  MY_MESSAGE = WM_USER + 4242;

...


SendMessage(FindWindow(nil,PChar('MeinFenster')), MY_MESSAGE, 0, DWORD(PChar('Hallo')));

...


cu

Onz
Moritz M. Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1672



BeitragVerfasst: Mi 23.10.02 18:53 
Ach, noch was
Die Message soll aus einer .dll gesendet werden. Gibt es sonst noch eine kommunikationsmethode zwischen .dll und dem Programm
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mi 23.10.02 20:39 
Onz hat folgendes geschrieben:
Hi

Noch eine Frage:
Wie kann Ich verschickte Strings empfangen
Es wird so versendet:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
...

const 
  MY_MESSAGE = WM_USER + 4242;

...


SendMessage(FindWindow(nil,PChar('MeinFenster')), MY_MESSAGE, 0, DWORD(PChar('Hallo')));

...



Sind das zwei Programme? Wenn du eine Message an dein eigenes Fenster schickst, dann brauchst du kein FindWindow(nil,PChar('MeinFenster')). Einfach das Handle des Fensters angeben.

Wie das empfangen wird steht in meinem Beispiel.
Moritz M. Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1672



BeitragVerfasst: Do 24.10.02 12:54 
So, nun hab ich das ganz mal probiert. Die Nachricht wurde anscheinend auch verschickt. Aber seitdem Ich die Prozedur hab kommen Immer wenn Ich Irgendwas in meinem Fenster mache Zugriffserrors.
Und manchmal meckert auch mein CoolTrayCompo....
Gibt es eine andere Methode der Kommunikation zwischen der .dll und meinem Porg.
Wie wäre es wenn Ich in die .dll ne Funktion reinschreibe, die prüft, ob was neues vorhanden ist, diese exportiere und dann alle 0.x secunden prüfe, ob was neues da ist?
Was anderes fällt mir gerade ed ein...
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Do 24.10.02 16:24 
Messages - das ist die Art wie Windows funktioniert. Bei jeder Kleinigkeit wird eine Message ausgesendet. In eine Sekunde werden einige hundert Messages versendet. Das ist also nicht irgendein Trick, sondern die normale Art. Delphi nimt uns da vieles an Messages ab, das bedeutet aber nicht, daß es bei Delphi ohne geht.

Du hast irgendwo ein Fehler gemacht. Zeig ihn uns (den Code) und wir können dir vielleich helfen.

//Edit

Fehler korrigiert


Zuletzt bearbeitet von Popov am Do 24.10.02 19:26, insgesamt 1-mal bearbeitet
Moritz M. Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1672



BeitragVerfasst: Do 24.10.02 17:41 
Hi

Ne, Ich habe nun eigentlich vor das von .dll nach .exe über ein Socket zu Regeln. Ich weiß zwar, dass das umständlich ist, aber einem Mann in Not fällt immer was ein... :wink:
Oder gibt es andere Methoden?