Newsgroup: it.comp.lang.delphi
Titolo: Avviare exe esterno ancorato alla form

Salve a tutti
Utilizzando l'Api shellexecute è ovviamente possibile lanciare un exe, 
tuttavia vi chiedo se è possibile lanciare un exe in modo che sia contenuto 
all'interno della form cioè se ad esempio lancio il notepad questo deve 
essere contenuto nella form e non deve poter essere spostato all'esterno 
della applicazione con cui viene lanciato.
Spero di essere stato chiaro
Ciao a tutti Maurizio 

 spostato all'esterno della applicazione con cui viene lanciato.
Una volta sono riuscito a fare una cosa del genere per un idea che mi era 
venuto per pacchettizzare un software ma i risultato non rientravano per 
niente nelle mie aspettative.
Purtroppo ho perso i sorgenti quindi non te li posso postare però ricordo 
che ho dovuto usare una api di windoz che si chiama SetParent, ricordo 
anche che non fu semplice capire come implementarlo.
ciao,
Diego
--- posted by geoForum on 
http://www.delphiedintorni.it

sulla chiusuare di questa shell e sull'esito della stessa.
Non è assolutamente vero... basta lanciare il processo, dallo handle del
processo risalire allo handle della finestra del thread principale e poi
fare una chiamata a Windows.SetParent.
In particolare poi se puoi risalire alla finestra del notepad (o altro
programma) con una FindWindow te la cavi addirittura con una sola riga di
codice:
Windows.SetParent(FindWindow('notepad', nil), Handle);
Ciao
-- 
Partecipa anche tu al Delphi Day 2005
http://www.delphiedintorni.it/geoxml/delphiday2005
-- 
Andrea /\/\agni - DeD Support Team 
http://www.delphiedintorni.it


 Spero di essere stato chiaro
Si lo sei stato: quello che vuoi ottenere non e' possibile.
ShellExecute come dice il nome stesso lancia un processo aprendo una shell,
di conseguenza tu ti distacchi dal tuo form e il notepad si apre in una
finestra e in un processo separato. L'unico controllo che puoi avere e'
sulla chiusuare di questa shell e sull'esito della stessa.
L'unico modo per fare quello che chiedi e' di integrare un notepad
direttamente nel tuo form: ad esempio, nella cartella Richedit dei Demos di
delphi, c'e' un esempio che puo' essere preso e aggiunto al tuo progetto.
ciao!
-- 
Morde. 
FAQ di icld (beta-version): 
http://icld.altervista.org
 
M-List di icld: 
http://it.groups.yahoo.com/group/icld/

 Windows.SetParent(FindWindow('notepad', nil), Handle);
Ti ringrazio che mi hai corretto, ho imparato una cosa nuova :)


 Ciao
Ciao,
Andrea

 ottenere una cosa stile MDI però non sono sicuro.
infatti! è quello che volevo fare all'epoca ma il risultato non faceva 
altro che complicare le cose, quindi abbandonai la cosa.


quindi io ci andrei piano con certi suggerimenti :-)
Io credo che su un ng si debba cercare di rispondere alle domande
piuttosto che tirare a indovinare quello che uno sta facendo... 
Ciao


 fare una chiamata a Windows.SetParent.
Tenendo però presente che il thread principale di un'applicazione è libero
di creare un numero qualsiasi di finestre.
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

di creare un numero qualsiasi di finestre.
Certamente, comunque il problema si riduce a quello di selezionare
l'handle della finestra giusta. (Problema per cui esistono svariate
soluzioni, se n'è parla spesso, sono sicuro ci siano molti thread a
riguardo anche su questo gruppo...)


>soluzioni, se n'è parlato spesso, 
                  ^^^^^^^^^
Scusate...


 Scusate...
Tranqui ;-)


 Ciao
Ciao,
Andrea


A meno di smentite RUBIO non è l'OP, per quel che vedo io l'OP si chiama 
Maurizio...


 fare una chiamata a Windows.SetParent.
scusate se m'intrometto nella discussione ma la cosa m'interessa molto perchè 
mi sto progettando una specie di piccolo framework da usare per le 
applicazioni con molte finestre, facendo uso di package + dynamic loading e 
appunto stavo studiando il modo per far apparire una form secondaria 
all'interno del Panel della form principale.
Finora non pensavo che si potesse fare in altro modo se non con i frames, 
solunzione che comporta però degli svantaggi; oppure soluzioni impobabili 
come una form senza bordo dimensionata sul Panel della mainform.
Un problema che non sono riuscito a risolvere con il caricamento dinamico 
(LoadPackage, GetProcAddress) è che la form secondaria (quella contenuta nel 
package, per intenderci) non era affatto sincronizzata con la form 
principale: 
- la form secondaria mostrava una specie di "icona di default" (la stessa che 
avevo visto per le form incluse in DLL, con Application.Handle = 0);
- la form secondaria appariva nella taskbar come un programma diverso dalla 
mainform;
- quando minimizzavo la form principale, la form secondaria non seguiva la 
riduzione a icona.
Tutto questo, avevo imparato leggendo da Cantù, nel caso delle form 
secondarie non modali contenute in DLL si può evitare ponendo 
l'Application.Handle della DLL uguale all'Application.Handle della MainForm.
Bene, con i package caricati dinamicamente sembra che non funzioni.
Se invece linko staticamente lo stesso package, c'è sicronizzazione - senza 
bisogno neanche di impostare l'Application.Handle.
A parte questa digressione, quindi mi basterebbe porre
  SecForm.Parent := MainForm.HostPanel
//HostPanel è il pannello destinato a contenere la form secondaria
(se fattibile, non ho mai provato in effetti perchè non pensavo fosse 
possebile).
O anche
  Windows.SetParent(SecForm.Handle, MainForm.HostPanel.Handle)
per ottenere semplicemente di visualizzare una form dentro un'altra?
-- 
Mauro Falzari 
   [ 
http://digilander.libero.it/mauro.falzari
 ]
 
 "Se guardi nell'abisso, anche l'abisso guarda in te." 
   (Friedrich Nietzsche)

 senza bisogno neanche di impostare l'Application.Handle.
un attimo, ho letto questo
 
http://bdn.borland.com/article/0,1410,27178,00.html
e mi sono accorto che non sto usando in maniera corretta il caricamento 
dinamico dei package. 
Faccio altre prove ed eventualmente riposto. Ciao.
