Newsgroup: it.comp.lang.delphi
Titolo: Frame

Poichè in più di un form ho l'esigenza di mostrare un DBGrid che visualizza 
i dati di uno stesso dataset, ho pensato di creare un frame con il DBGrid e 
usare questa frame in tutti questi form.
Nel frame, oltre al DBGrid, ho aggiunto un componente DataSource (il cui 
nome ho assegnato alla property DataSource del DBGrid).
Il Form chiamante crea il frame e e passa come parametro del Create il 
Dataset che nel Create stesso viene assegnato alla property Dataset del 
DataSource, come segue:
MyQuery.Open;
frame1:= TFrameDBGrid.Create(MyQuery);
 
Il Create della frame è molto semplice:
constructor TFrameDBGrid.Create(aDataset: TDataset);
begin
  inherited Create(Owner);
  DBGridDS.DataSet:= aDataset;
end;
 
La cosa non funziona, nel senso che il chiamante apre il Dataset (TQuery), 
passa nel Create del frame il nome del Dataset, ma il frame viene 
visualizzato con il DBGrid vuoto.
 
Cosa sbaglio ?
 
 
 
 
---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
 
 

1) Hai verificato chi è l'owner al quale fai riferimento nella inherited?
2) il parent dove lo assegni?
3) le dimensioni del frame come le definisci?
 
 
A parte ciò, io farei in un altro modo:
 
1) eliminerei il costruttore ereditato
2) aggiungerei una property di tipo tdataset
3) aggiungere un metodo setup che assegna al datasource il tdataset della property al punto 2
 
A.
 
 

Ciao,
  ti ha gia' risposto Alberto, quindi e' poco piu' di una ripetizione.
 
Io quando uso i frame creo un nuovo constructor dove personalizzo la 
creazione del frame, tipo CreateNew, dove mantengo il AOwner : TComponent;
 
Una cosa simile, nel tuo caso, puo' essere
 
MyQuery.Open;
frame1:= TFrameDBGrid.CreateNew(MyForm,MyQuery); // MyForm e' la tua form 
oppure puo' essere nil, ma se usi nil poi la devi liberare tu con un 
destructor)
 
constructor TFrameDBGrid.CreateNew(AOwner : TComponent; aDataset: TDataset);
begin
  inherited Create(AOwner);
  DBGridDS.DataSet:= aDataset;
end;
 
Cosi' facendo io non ho problemi con i frame
 
Ovviamente il CreateNew dev'essere visiblie e (non so perche' .... ma e' un 
mio limite sui frame) il CreateNew ( ed eventualmente il destructor) va 
dichiarato nella PUBLIC
 
  TFrameDBGrid= class(TFrame)
  private
    { Private declarations }
 
  public
    { Public declarations }
 
    constructor CreateNew(AOwner : TComponent; aDataset: TDataset);
    destructor Destroy; override;
 
  end;
 
Vedi se cosi' funziona !!!!
 
ciao
 
Daniele 
 

"Alberto Salvati"  ha scritto nel messaggio 
news:557d7457-a183-4b58...@googlegroups.com...
1) Hai verificato chi č l'owner al quale fai riferimento nella inherited?
2) il parent dove lo assegni?
3) le dimensioni del frame come le definisci?
Grazie dei suggerimenti. Al solo scopo di capire meglio, cerco di rispondere 
alle domande che mi poni:
1) Pensavo che essendo il Create un constructor della TFrameDBGrid, l'Owner 
fosse automaticamente la frame..
2) Non capisco la domanda sul parent. Dalla palette, ho aggiunto il frame al 
form che lo ospita, e assegnato 'alClient' alla property align del frame, 
che pertanto assume le dimensioni del form. Forse secondo te avrei dovuto 
aggiungere delle properties per definire le dimensioni del frame dal form ?
 
 
---
Questa e-mail č stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
 
 

 
"Alberto Salvati"  ha scritto nel messaggio 
news:557d7457-a183-4b58...@googlegroups.com...
1) eliminerei il costruttore ereditato
2) aggiungerei una property di tipo tdataset
3) aggiungere un metodo setup che assegna al datasource il tdataset della 
property al punto 2
----
Allora, ho tolto il costruttore e definito quanto segue nella unit della 
frame:
FDataset: TDataset;   (private)
property aDataset: TDataset read FDataset write FDataset;      (public)
procedure TFrameDBGrid.SetDataset;
begin
  DBGridDS.DataSet:= aDataset;
end;
 
Nel form chiamante:
Frame1:= TFrameDBGrid.Create(Self);
Frame1.aDataset:= MyQuery;
Frame1.SetDataset;
 
Tuttavia, il DBGrid nel frame continua a non mostrare nulla. C'è ovviamente 
qualcosa che mi sfugge e non riesco a vederlo...


Grazie anche a te e ripeto quello già detto ad Alberto. Il DBGrid continua a 
rimanere vuoto e ho provato anche la tua soluzione. Ma evidentemente sto 
facendo qualche grossa cazzata di cui non mi rendo ancora conto ... Eppure 
sembra così semplice 


Ho trovato ! Non so come chiedere scusa per il vostro tempo! E pensare che 
Alberto Salvati me lo aveva detto subito: dov'č il parent ?
Mancava e ci voleva ! L'ho messo e tutto funziona. Grazie, grazie !! 
 
 
---
Questa e-mail č stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus