26. april 2012 - 17:06Der er
5 kommentarer og 1 løsning
SendMessage
Hej,
Er der nogen der kan sige mig hvordan jeg kan sende en besked fra et af mine programmer til et andet af mine programmer kodet i borland delphi 7.
Jeg har fået sendmessage til at fungere, og jeg modtager også beskeden i det andet program. Men min udfordring er at jeg ønsker at kunne fange beskeden lige meget hvor jeg står i mit program.??
Hvordan kan dette laves? et eller andet med en global handler som på en eller anden måde kan informere mig om at en besked er modtaget fra mit andet program.
Seancen er den at mit hovedprogram skal starte et andet program der afvikler en stored procedure, og når det er færdigt skal det informere hovedprogrammet om at jobbet er færdigt kørt.
På denne måde slipper mit hovedprogram fra at vente på jobbet. og ja dette kan sikkert løses med threads i mit hovedprogram, men det gider/tør jeg ikke rigtig i gang med:-(
noget kode: *** sender *** procedure TfrmMsg.btmSendMsgClick(Sender: TObject); var stringToSend : string; copyDataStruct : TCopyDataStruct; begin stringToSend := 'About Delphi Programming';
stringToSend:=Memo1.Text; copyDataStruct.dwData := 0; //use it to identify the message contents copyDataStruct.cbData := 1 + Length(stringToSend) ; copyDataStruct.lpData := PChar(stringToSend) ;
SendData(copyDataStruct) ; end;
procedure TfrmMsg.SendData(const copyDataStruct: TCopyDataStruct) ; var receiverHandle : THandle; res : integer; pres : Boolean; begin receiverHandle := FindWindow(PChar('TnewReceive'),PChar('Receive')) ; if receiverHandle = 0 then begin ShowMessage('CopyData Receiver NOT found!') ; Exit; end;
res := SendMessage(receiverHandle, WM_COPYDATA, Integer(Handle), Integer(@copyDataStruct)) ; end;
procedure TnewReceive.WMCopyData(var Msg: TWMCopyData) ; var s : string; begin s := PChar(Msg.CopyDataStruct.lpData) ; Memo1.Lines.Insert(0,s); end; *** modtager ***
i ovenstående modtager program, har jeg implementeret WMCopyData i form newReceive, men hvordan kan jeg fange besked lige meget i hvilken form jeg står i, og slippe for at implementere modtager proceduren i alle forme ?
Den starter notepad som et baggrundsjob, og terminering af notepad registreres i timer1timer. Måske ikke super elegant, men det burde kunne løse dit problem.
var Form1: TForm1;
implementation
{$R *.dfm} var hProc : thandle; var StartInfo : TStartupInfo; ProcInfo : TProcessInformation; CreateOK : Boolean;
procedure TForm1.Button1Click(Sender: TObject); begin { fill with known state } FillChar(StartInfo,SizeOf(TStartupInfo),#0); FillChar(ProcInfo,SizeOf(TProcessInformation),#0); StartInfo.cb := SizeOf(TStartupInfo); CreateOK := CreateProcess(nil, PChar('c:\windows\notepad.exe'), nil, nil,False, CREATE_NEW_PROCESS_GROUP+NORMAL_PRIORITY_CLASS, nil, nil, StartInfo, ProcInfo); { check to see if successful } if not CreateOK then begin ShowMessage('Unable to run notepad.exe'); end; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin if not createok then exit; caption := inttostr(MsgWaitForMultipleObjects( 1, ProcInfo.hProcess, FALSE, INFINITE, QS_ALLINPUT)); if caption ='0' then begin CloseHandle(ProcInfo.hProcess); CloseHandle(ProcInfo.hThread); end; end;
Jeg benytter også WM_COPYDATA og har lavet det på samme måde som dig og jeg modtager beskeden uanset hvor/hvilken form der er aktiv selvom WMCopyData kun er i hoved formen.
Hej og tak for svar, kloge: Det med timeren kan lade sig gøre, men jeg vil heller have det som messages:-
kroning:
jeg modtager beskeden i min hovedform, og ikke i en evt. subform, som er det jeg ønsker WMCopyData proceduren er jo implementeret i TnewReceive, og derfor vil beskeden modtages her ikke sant!?
Det bedste ville være at når hovedprogrammet modtager beskeden, at beskeden sendes til den form som er aktiv/ligger øverst, således at man inden i den kan notificere brugeren om at jobbet er færdigt
Hvordan sender du din besked? Jeg sender jo ved hjælp af formen og vha caption på formen?? måske det er forkert at gøre det således!?
Hvis du har mange forme som skal kunne modtage beskeden fra MainFormen er der jo mulighed for at alle dine forme er baseret (arve) på en grundform som så indeholder modtager koden.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.