Newsgroup: it.comp.lang.delphi
Titolo: dll, mi sembra strano ma è proprio cosi?

Ciao a tutti, da un mio programma chiamo una dll che contiene delle form e
mi accade una cosa che nn avevo notato, quando chiamo una form contenuta in
una dll mi appare sulla barra di windows una finestra come quelle che si
aprono quando aprite un applicazione solo che nn vorrei apparisse, è
possibile fare qualcosa, c'è un qualche rimedio.
Grazie
Antonio.



Application.Handle.
dall'help:
When writing a DLL that uses VCL forms, assign the window handle of
the host EXE's main window to the DLL's
Application.HandleApplication->Handle property. This makes the DLL's
form part of the host application. Never assign to the Handle property
in an EXE.
In pratica quando creo una form in una DLL faccio qualcosa del tipo:
function RunArc(AHandle: HWND): Integer; stdcall;
begin
  Result := -1;
  if AHandle = 0 then
    AHandle := GetActiveWindow;
  Application.Handle := AHandle;
  try
    with TArcForm.Create(Application) do begin
      try
        ShowModal;
        Result := 0;
      finally
        Free;
      end;
    end;
  except
    on E: Exception do
      Application.HandleException(E);
  end;
  Application.Handle := 0;
end;
e nell'applicazione principale:
RunProc(Application.Handle)
ciao.
-- 
"La velocità luce non è sufficiente Comandante Nunziatella, 
dobbiamo passare alla velocità smodata!"

 ciao.
Ciao,
Andrea

 ha scritto nel messaggio
news:TreHc.14206$tP4.5...@news4.tin.it...

Sinceramente sono un po confuso, nn ho ben capito come usare il vostro
codice.
Potete spiegarmi meglio?
Grazie
Antonio.

costruttore apposito?
Perchè devo bypassare TCustomForm  per usare CreateParented quando 
il sistema giusto è quello di utilizzare TApplication?
CreateParented nasce per utilizzare una "parent-window" non VCL.
Prova ad utilizzare CreateParented con una form con BorderStyle=
bsSizeable.



Come crei la form nella DLL? Posta il tuo codice, che è più facile
spiegare come fare :-)


 CreateParented nasce per utilizzare una "parent-window" non VCL.
Vale a dire la stragrande maggioranza dei casi quando vuoi utilizzare una
form in una DLL con altri linguaggi.
Riguardo al bypass di TCustomForm, darň un'occhiata ai sorgenti di
CreateParented.
Andrea


questa è la funzione che sta nella dll in cui creo la form:
function RicClienti : integer;stdcall;
begin
  if DM = nil then
  DM:=TDM.Create(Application);
if FRic_Cli = nil then
   FRic_Cli:=tFRic_Cli.Create(Application);
   result := 0;
   FRic_Cli.ShowModal;
freeandnil(FRic_Cli);
freeandnil(DM) ;
end;


Fine!

 Fine!
Non capisco, mi hai chiesto qual'è il codice che chiamo, questa è una delle
funzioni che chiamo e qui creo la form.
spero di aver chiarito.
Grazie
Antonio.

form in una DLL con altri linguaggi.
NON in questo caso, il che era alquanto chiaro. Stiamo parlando di una
TFORM in una DLL chiamata da una TAPPLICATION.
Puro VCL quindi: certo che se vuoi girare la frittata, hai ragione.
Una form chiamata da un'applicazione scritta in un altro linguaggio
*richiede* per forza CreateParented.
Ciao.

funzioni che chiamo e qui creo la form.
Se rileggi la mia risposta, noterai che ho aggiunto una linea di
codice al tuo ;-)

 codice al tuo ;-)
Scusa nn avevo visto, grazie funziona alla grande, ma ti posso chiedere a
cosa servono le istruzioni
FRic_Cli:=tFRic_Cli.Create(Application);
ovvero perchè nel costruttore ci va application, e poi
cosa fa l'istruzione :
Application.Handle := GetActiveWindow;
grazie per la pazienza
Antonio.



L Application.Handle è il riferimento diretto alla Form principale
dell'applicazione che lancia la DLL.
Passandogli il valore della MainForm fai si che il sistema operativo
riconosca la nuova form come una "figlia" (non nel senso stretto di
Parent, forse è meglio dire indica l'owner dell'applicazione) (e qui
il buon Laforgia mi farà un cazziatone :p)  e non come un'applicazione
nuova, in questo modo sulla taskbar verai un solo bottone e agiranno
insieme per quanto riguarda le operazioni di fuoco (ZOrder,
BringToFront etc).
Il sistema migliore sarebbe quello di passare questo handle
direttamente dalla applicazione principale, nel tuo caso
function RicClienti(AHandle: HWND) : integer;stdcall;
begin
  Application.Handle := AHandle;
e chiamarla così RicClienti(Application.Handle).
In mancanza di questa informazione si può usare l'API GetActiveWindow
che *dovrebbe* tornare l'handle giusto (non so però se vi possano
essere situazioni in cui ciò sia falso).
Il sistema CreateParented che era stato proposto, pur essendo valido
nella maggior parte dei casi, può fallire con le VCL in quanto non
inizializza la variabile Application.Handle, base vitale della VCL ;-)


 essere situazioni in cui ciò sia falso).
Grazie, aevo capito che riguardava l'handle ma nn avevo capito che
getactivewindow era una api, ma per quanto riguarda il costruttore della
form nel create perchè ci metto application?Mi sa che seguiro il tuo
consiglio sicuramente è una soluzione piu pulita.
grazie mille sei stato molto gentile.
Antonio.