Autor |
Beitrag |
galagher
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mo 06.08.07 19:08
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; function WMCopyData(var Msg: TWMCopyData): String; message 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mo 06.08.07 20:28
BenBE 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?
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mo 06.08.07 20:51
BenBE 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
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mo 06.08.07 20:57
_________________ We are, we were and will not be.
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mo 06.08.07 21:25
Gausi 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; 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 function WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA: String; |
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
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 07.08.07 20:41
Gausi hat folgendes geschrieben: | Und wo ist das Problem? |
Es wäre halt einfacher!
Gausi 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!
|
|
|