Entwickler-Ecke

Sonstiges (Delphi) - Prozedur zu Funktion machen - aber wie mit message?


galagher - Mo 06.08.07 19:08
Titel: Prozedur zu Funktion machen - aber wie mit message?
Hallo!

Wie mache ich aus der Prozedur WMCopyData...

Delphi-Quelltext
1:
2:
3:
4:
5:
unit Unit1;
//..
  private
    procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
//..

...eine Funktion:

Delphi-Quelltext
1:
2:
3:
4:
  private
    function WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA: String;  //So geht das aber nicht!
//Und so auch nicht:
    function WMCopyData(var Msg: TWMCopyData): Stringmessage WM_COPYDATA;

Und wie bekomme ich diese Funktion dann in eine andere Unit als die, die mit private gemeint ist?
Ich möchte den Code von WMCopyData in eine andere Unit auslagern, damit ich ihn in verschienden Programmen nutzen kann. Dazu ist es aber nötig, dass es eine Funktion ist, da ich ja den Rückgabewert benötige.


BenBE - Mo 06.08.07 20:10

Dann nutze einen Stub, d.h. schreib in der anderen Unit die gesamte Behandlung und leite den Aufruf von WMCopyData einfach weiter.


galagher - Mo 06.08.07 20:28

user profile iconBenBE hat folgendes geschrieben:
Dann nutze einen Stub, d.h. schreib in der anderen Unit die gesamte Behandlung und leite den Aufruf von WMCopyData einfach weiter.


Delphi-Quelltext
1:
2:
3:
4:
5:
unit andereUnit;
//..
  private
    procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
//..

Das habe ich schon versucht, aber dort erkennt Delphi private bzw. message nicht an ("Unbekannte Anweisung ..."). Ich glaube, der Sinn ist klar: Ein Programm ist der Sender, das andere der Empfänger, WMCopyData ist der Empfangsteil des Empfängers. Ob nun ein String oder ein Bitmap oder sonstwas gesendet wird, ist zunächst ja einerlei, nur das Wie interessiert mich.

Wie meinst du das mit dem Stub und in der anderen Unit die gesamte Behandlung schreiben? Welcher Code?


BenBE - Mo 06.08.07 20:31

Dann lass doch einfach in der zweiten Unit das message weg, weil dort brauchst Du es doch gar nicht ;-)

Aufrufen kannst Du die Methode auch ohne diesen Zusatz


galagher - Mo 06.08.07 20:51

user profile iconBenBE hat folgendes geschrieben:
Dann lass doch einfach in der zweiten Unit das message weg, weil dort brauchst Du es doch gar nicht ;-)

Aufrufen kannst Du die Methode auch ohne diesen Zusatz

Dann funktioniert es aber nicht. Das Prinzip ist: Sender hat eine Funktion, die die Eingabedaten aufbereitet und eine Funktion SendCopyData aufruft, die dann per SendMessage(hTargetWnd, WM_COPYDATA,... an den Empfänger sendet:

Sender -> [Aufbereitung] -> SenderFunktion -> Empfänger.

Ist aber der Empfangsteil WMCopyData in einer anderen Unit als in der Empfänger-Unit, klappt es nicht.


Gausi - Mo 06.08.07 20:57
Titel: Re: Prozedur zu Funktion machen - aber wie mit message?
Ich glaube, BenBE meint in etwa sowas:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
unit Unit1;
//..
  private
    procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
//..

procedure TForm1.WMCopyData(var Msg: TWMCopyData);
begin
  EinTollesErgebnis := EineFunktionAusUnit2(Msg);
end;



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
Unit2

function EineFunktionAusUnit2(var Msg: TWMCopyData): EinTollerErgebnisTyp;
begin
  Msg.result := 1// oder 0 oder sonstwas, was wird da so erwartet?
  result := 42;
end;


galagher - Mo 06.08.07 21:25
Titel: Re: Prozedur zu Funktion machen - aber wie mit message?
user profile iconGausi hat folgendes geschrieben:
Ich glaube, BenBE meint in etwa sowas:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
unit Unit1;
//..
  private
    procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
//..

procedure TForm1.WMCopyData(var Msg: TWMCopyData);
begin
  EinTollesErgebnis := EineFunktionAusUnit2(Msg);
end;



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
Unit2

function EineFunktionAusUnit2(var Msg: TWMCopyData): EinTollerErgebnisTyp;
begin
  Msg.result := 1// oder 0 oder sonstwas, was wird da so erwartet?
  result := 42;
end;


Aber genau das habe ich ja schon jetzt :?

Nochmal: Alles nötige ist ja schon in der anderen Unit, nur der Empfangsteil
procedure TForm1.WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
nicht. Der ist noch in der Empfänger-Unit.

Es soll also WMCopyData(var Msg: TWMCopyData) keine Prozedur in der Empfangs-Unit sein, sondern eine Funktion in einer anderen Unit, die ich in der Empfänger-Unit nutzen kann, so etwa:


Delphi-Quelltext
1:
2:
3:
4:
Unit andereUnit;
//..
 private  //Mag Delphi nicht!
    function WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA: String;  //So geht das aber nicht!


In einer anderen Unit werden aber weder private noch message akzeptiert, und wenn ich das weglasse, ist der Code syntaktisch zwar korrekt, aber das Empfangen funktioniert nicht. Das Empfangsprogramm tut einfach gar nichts.


Gausi - Mo 06.08.07 21:34

Und wo ist das Problem? Die drölftausend-Zeilen-Funktion EineFunktionAusUnit2 lagerst du aus und bindest diese Unit in deine Projekte ein. Dort muss du dann nur auf die message reagieren und diese Funktion aufrufen. Sind ungefähr 4 Zeilen Code.

Wie stellst du dir denn vor, dass Windows eine Nachricht an diese Unit schickt, die dann dort abgefangen wird? Das geht nicht. Die Nachricht geht an das Fenster und muss da empfangen und verarbeitet werden.

Edit: Evtl. Könntest du dir von TForm eine neue Basisklasse für deine Forms ableiten, die automatisch auf diese Art auf WMCopyData reagiert. Aber ob das unbedingt sinnvoll ist, bezweifle ich...


galagher - Di 07.08.07 20:41

user profile iconGausi hat folgendes geschrieben:
Und wo ist das Problem?

Es wäre halt einfacher!

user profile iconGausi hat folgendes geschrieben:
Wie stellst du dir denn vor, dass Windows eine Nachricht an diese Unit schickt, die dann dort abgefangen wird?

Ja, so ungefähr.

Geht eben nicht, ok! Danke für eure Hilfe!