Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: antoniog - Settembre 05, 2021, 07:35:16 pm

Titolo: [RISOLTO]Programma esterno in TPanel
Inserito da: antoniog - Settembre 05, 2021, 07:35:16 pm
Stò provando a divertirmi nel cercare di fare girare un programma esterno, tipo KompoZer in un pannello all'interno di una Form.
Sono in parte riuscito ma funziona male perchè se il programma esterno non è attivo non viene inserito nel pannello questo è il codice
Codice: [Seleziona]
procedure TForm1.Button5Click(Sender: TObject);
Var lsprocess : string;
       lsCommandLine : string;
       HFindWin  : THandle;
Begin
 lscommandline := '';
 lsprocess := 'C:\Program Files (x86)\KompoZer\kompozer.exe';
 shellExecute(Form1.Handle,'open',pchar(lsprocess),pchar(lscommandline),nil,sw_Hide);
 HFindWin:=FindWindow(nil,'senza titolo - KompoZer');
Attach2Control(HFindWin, Panel2);
end;



procedure Attach2Control(aWnd: Hwnd; aControl: TWinControl);
    var
      WPM: WINDOWPLACEMENT;
    begin
      Windows.SetParent(aWnd, aControl.Handle);
     SetWindowLong(aWnd, GWL_STYLE, GetWindowLong(aWnd, GWL_STYLE) and not WS_CAPTION);
      WPM.Length := SizeOf(WPM);
      GetWindowPlacement(aWnd, @WPM);
      WPM.ShowCmd := SW_ShowMaximized;
      WPM.rcNormalPosition := Classes.Rect(0, 0, aControl.Width, aControl.Height);
      SetWindowPlacement(aWnd, @WPM);
    end;     


premendo il pulsante la prima volta lancia il programma, la seconda volta lancia il programma e lo inserisce nel pannello.
Vorrei inserire subito la prima volta il programma nel pannello, è possibile?
Titolo: Re:Programma esterno in TPanel
Inserito da: DragoRosso - Settembre 06, 2021, 02:06:48 pm
La shellexecute è asincrona, nel senso che ti ritorna immediatamente dopo che viene lanciata la shell (il cmd classico)  ma prima che diventino "operativi" programmi o altro lanciati dalla shell stessa.
 
Nel tuo caso semplicemente "loopa" dove fai il FindWindow fino a quando l'handle ritornato è valido (ci potrebbero volere anche diversi secondi).

Nel loop mantieni un contatore con un sleep(100) fino al massimo di 5 secondi (quindi circa 50 loop), oltre questo tempo generi un errore (il programma probabilmente non è stato lanciato).

Ciao
Titolo: Re:Programma esterno in TPanel
Inserito da: antoniog - Settembre 06, 2021, 04:35:07 pm
@DragoRosso, grazie. mettendo sleep(1000) funziona, e funziona anche utilizzando TProcess al posto di ShellExecute