Newsgroup: it.comp.lang.delphi
Titolo: Modificare lo stato di un componente nel form principale da package

Ciao a tutti,
avrei un problemino da risolvere: ho il FormMain principale che al
click del menu carica una bpl a runtime in modo dinamico e questa bpl
dopo una serie di verifiche e controlli dovrebbe abilitare/
disabilitare il menu presente nella stessa form chiamante.
Form e bpl non hanno alcun riferimento tra loro ma ho provato a
inserire il FormMain nelle uses della bpl per poi settare l'enable del
menu e durante la compilazione non ho errori ma quando viene eseguito
ho un'access violation.
Immaginavo fosse troppo scontato ma ho tentato ugualmente ma a questo
punto non saprei come fare per risolvere il problema.
Potreste darmi una mano per cortesia? Come posso modificare lo stato
di un componente presente nel form principale da una bpl?
Grazie mille


Nessuno che può darmi qualche indicazione? Anche solo mostrarmi la
via...
Grazie

[...]
Come procedimento generale, mi sembra errato e rischioso: poni il caso 
in cui magari domani dovrai intervenire anche su un altro elemento 
grafico che non sia il form principale...
Secondo me, hai due strade possibili, che ti descrivo in maniera teorica:
1)
invertire la dipendenza facendo in modo che sia il form ad aggiornarsi, 
magari nei tempi di inattività (idle) dell'applicazione, in base allo 
stato esposto dall'oggetto implementato nel package;
2)
applicare il Design Pattern "Observer" 
(
http://it.wikipedia.org/wiki/Observer_pattern
) in modo che non vi sia 
un riferimento diretto tra i tipi di oggetto coinvolti, ma con un 
meccanismo che consenta all'uno di essere notificato di cambiamenti 
dell'altro, magari estendendolo in modo che sia applicabile a qualsiasi 
oggetto generico (che si tratti di un'istanza di una classe, di un 
componente o di un controllo visuale).
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

Io farei in modo di poter passare al package una callback. Una cosa
del tipo:
  TPKGNotifyEvent = procedure(sender: TOBject; AEventData: TObject) of
object;
Poi prepari una classe di questo tipo:
TPackageEventdata = class
public
  property Qualcosa: integer....
  property Tizio: string;
  ....
end;
Nel tuo form, dichiari una cosa di questo tipo:
  procedure TSomeForm.OnReceivePackageNotification(sender: TOBject;
AeventData: TObject);
  var
    PreparedEventdata: TPackageEventdata;
  begin
      if (Assigned(AEventData)) and (AEventData is  TPackageEventdata)
then
      begin
        PreparedeventData := TPackageEventdata(AEventdata);
       // .. qua fai i k@@@i tuoi....
     end;
  end;
Poi:
1) Il tuo mainform carica il pakage
2) dopo il caricamento, passa la callback al package
Nel tuo package fai prima un check per verificare se la callback e'
assegnata.
Se si, gli fai fare il lavoro che ti serve, crei una istanza di
TPackageEventdata, ne assegni le property e chiami la callback. Dopo
la callback, ovviamente (ma non per tutti..) fai la free di questa
istanza.
Cia' cia'
A.

Grazie mille a tutti e due, in un modo o nell'altro vedrò di risolvere
la cosa.

Starei valutando l'ipotesi di usare l'Observer pattern, soluzione
molto interessante ma anche complessa da quello che ho visto.
Sicuramente molto utile ma richiede un bel po di tempo per lo studio
per cui purtroppo dubito fortemente di poterlo usare già per questo
progetto.
Sto cercando un po di materiale che mi dia delle info generali con
degli esempi da studiare, se qualcuno ha link validi ben venga!
Grazie a tutti