Newsgroup: it.comp.lang.delphi
Titolo: Creazione frame da DLL e posizionamento su contenitore del form  chiamante

Ciao a tutti,
ho il form principale che richiama diverse funzioni inserite in una
DLL; la DLL dovrebbe creare un frame e posizionarlo su un TPanel
presente nel form chiamante.
Questo è il codice
if StartFrame = nil then
  StartFrame := TStartFrame.Create(nil);
if StartFrame <> nil then
  StartFrame.Parent := FormMain.PagePanel;
Nelle Uses ho aggiunto il form principale quindi non mi da errore
durante la compilazione ma quando esegue la riga in cui dovrebbe
posizionare il frame su PagePanel mi da access violation perchè
FormMain è a nil.
Sapete darmi una dritta su come risolvere il problema?
Grazie mille

come hai scritto tu, la dll conosce la CLASSE  e non l'ISTANZA.
Quella la devi passare tu...
A.


Allora, ho fatto in questo modo:
nella form principale richiamo la procedura InizializzeForm(Form:
TPersistent); StdCall; external 'Lib.dll';
InizializzeForm(TFormMain(FormMain).PagePanel);
Mentre nella DLL assegno l'istanza
procedure InizializzeForm(Form: TPersistent); export; StdCall;
begin
   FormMain := TFormMain(Form);
end;
e il posizionamento del frame l'ho modificat in questo modo
if StartFrame <> nil then
      StartFrame.Parent := FormMain;
In fase di compilazione però mi restituisce questo errore "Cannot
assign a TFont to a TFont". Dove sto sbagliando?
Grazie

 end;
formmain di che tipo è? fai un cast di panel a form?
...
A.


Effettivamente TPersistent era rimasto da prove precedenti, ora l'ho
modificato in TFormMain infatti FormMain è di tipo TFormMain
PagePanel è un TPanel

se posti del codice corretto forse si riesce a darti una mano.
A.

 presente nel form chiamante.
Un primo errore, o comunque una scelta che può comportarne parecchi, è 
quella di aver utilizzato una DLL al posto di un package, che è 
senz'altro un mezzo più adatto per condividere elementi specifici di 
Delphi (classi, Form, ecc.).
In secondo luogo, non vedo perché dovrebbe essere la DLL a occuparsi del 
posizionamento del Frame sul Form principale; logicamente, è molto 
meglio che la DLL restituisca semplicemente un'istanza del Frame e che 
questo Frame possa poi venire memorizzato o visualizzato a piacimento 
ovunque si voglia.
Se la DLL serve per implementare un'interfaccia utente modulare, un 
domani che si voglia mostrare tale interfaccia, implementata dal Frame, 
all'interno di un controllo differente dal pannello in questione, 
modifichi e ricompili ogni singola DLL?
Secondo me, prima di avviarti in un'implementazione "rischiosa", 
dovresti analizzare meglio il problema e la soluzione migliore per 
risolverlo.
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)


Ciao Marco,
allora ti spiego cosa devo fare e perchè ho optato per la DLL.
Premetto che è la prima volta che mi cimento in package quindi oltre a
leggermi vari manuali e info faccio alcune prove per riuscire ad
ottenere quello che vorrei anche se purtroppo non ho ancora le idee
chiare sul funzionamento e l'utilizzo dei package; dovendo creare
un'applicazione altamente modulare, ho scelto l'uso di package per
sfruttare tutte le loro potenzialità con la speranza di semplificarmi
la vita anche se in realtà allo stato attuale delle mie conoscenze me
la stanno complicando. Ogni package, che contiene vari frame, deve
essere incluso nel progetto principale a seconda di quanto viene
richiesto dal cliente e da un frame comune presente nel form
principale e incluso nel progetto "pilota" devo poter caricare tutti i
package necessari e far visualizzare i frame in essi contenuti in base
alle richieste dell'utente. Domanda: posso creare un package di base
che contiene tutte le unit necessarie (il form main, i frame inclusi
nel progetto pilota e tutti i frame relativi ai package) per poi
essere usato come package di riferimento per tutti gli altri package e
per inserire delle procedure di caricamento dei frame a seconda delle
selezioni dell'utente? Quindi in sostanza, attraverso il package base
posso richiamare tutti i frame relativi ai package che vengono
richiesti all'occorenza e farli visualizzare nel form principale?
Spero di essermi spiegato decentemente.
Grazie mille