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; 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.
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
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?
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
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.
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; result := 42; end; |
galagher - Mo 06.08.07 21:25
Titel: Re: Prozedur zu Funktion machen - aber wie mit message?
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.
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
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!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!