Autor Beitrag
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 06.08.07 19:08 
Hallo!

Wie mache ich aus der Prozedur WMCopyData...
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
unit Unit1;
//..
  private
    procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
//..

...eine Funktion:
ausblenden 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.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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.

ausblenden 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?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mo 06.08.07 20:57 
Ich glaube, BenBE meint in etwa sowas:

ausblenden 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;


ausblenden 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;

_________________
We are, we were and will not be.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 06.08.07 21:25 
user profile iconGausi hat folgendes geschrieben:
Ich glaube, BenBE meint in etwa sowas:

ausblenden 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;


ausblenden 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:

ausblenden 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.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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...

_________________
We are, we were and will not be.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!