Avatar billede Greenland Nybegynder
26. april 2012 - 17:06 Der 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;

*** sender ***

*** modtager ***
  procedure WMCopyData(var Msg : TWMCopyData) ; message WM_COPYDATA;

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 ?

Håber problemet er forståeligt:..

vh
greenland
Avatar billede kloge Nybegynder
26. april 2012 - 17:57 #1
Prøv denne kodestump.

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;

end.
Avatar billede kroning Nybegynder
26. april 2012 - 23:49 #2
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.
Avatar billede Greenland Nybegynder
27. april 2012 - 10:49 #3
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!?

vh
greenland
Avatar billede kroning Nybegynder
27. april 2012 - 18:09 #4
Jeg sender om modtager på samme måde. Min MainForm modtager beskeden og sender den videre til den form som er aktiv og skal bruge beskeden.
Avatar billede kroning Nybegynder
27. april 2012 - 18:12 #5
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.
Avatar billede Greenland Nybegynder
10. juli 2012 - 12:30 #6
lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester