Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: schumi - Luglio 31, 2015, 02:40:12 pm

Titolo: anomalia datamodule??
Inserito da: schumi - Luglio 31, 2015, 02:40:12 pm
ho una form clienti con il suo bel datamodule aperto runtime nel create, l'oggetto datamodule è dichiarato nella sezione Private, tutto funziona bene.

se da una form documenti riapro (create(self)+showmodal) nuovamente la stessa form clienti per usarla in "modalità ricerca", la seconda form visualizza gli stessi filtri della prima come se puntassero allo stesso oggetto, ma non dovrebbe essere  ??? ???

dove sbaglio?

spero di essermi spiegato
grazie

Titolo: Re:anomalia datamodule??
Inserito da: nomorelogic - Luglio 31, 2015, 10:10:56 pm
Probabilmente il puntatore che usi x  la creazione è quello definito nella unit del datamodule (var nella sezione interface). Dovresti definire una property x ogni form per essere sicuro di non usare lo stesso puntatore. Spero di essermi spiegato
Titolo: Re:anomalia datamodule??
Inserito da: schumi - Agosto 03, 2015, 09:09:33 am
ho trovato il problema nel datasource degli oggetti TDBEdit nella form....puntano al primo datamodule, riassegnando con un ciclo il datasource nel create dopo funziona.
però mi chiedevo quel'è la strategia migliore, anche se non mi piace qualche volta mi chiedono di poter aprire la stessa form 2 volte per affiancarle: devo evitare i componenti tipo TDBEdit e usare TEdit o va bene riassegnare runtime? perché in fase di costruzione l'IDE non permette di assegnare il datasource con variabili o cose che non siano un datasource già esistente.

grazie
ciao
Titolo: Re:anomalia datamodule??
Inserito da: nomorelogic - Agosto 03, 2015, 08:07:52 pm
come ti avevo accennato sopra devi creare una property nel form di tipo TMioDataModule.
Ad esempio:
Codice: [Seleziona]
class TForm1 = class(TForm)
private
  ...
  FLocalDm: TMioDataModule;
  ...
public
   property LocalDm: TMioDataModule read FLocaldm write FLocalDm;
end;

Nella Create del form, fai come sotto:

Codice: [Seleziona]
procedure TForm1.Create(...
  FLocalDm:=TMioDataModule.Create(self);

  // ora devi cambiare i puntatori ai datasource
  DataSource1.DataSet:=LocalDm.Table1;

end;

Edit:
in questo modo ogni istanza della classe TForm1 avrà il suo datamodule privato
Titolo: Re:anomalia datamodule??
Inserito da: schumi - Agosto 04, 2015, 12:25:23 pm
conviene quindi mettere i datasource direttamente nella form e lasciare nel datamodule solo tabelle e query?

grazie :)
Titolo: Re:anomalia datamodule??
Inserito da: Stilgar - Agosto 04, 2015, 12:46:21 pm
Shumi. Se vuoi tenere separate le cose non conviene.

Forse non mi è chiara l'esigenza.

In quel datamodule cosa c'è? La connessione al database o solo componenti "non visibili"? Tipo menu e simili.
A seconda di quello che contengono potrebbe essere il caso di avere politiche di life time diverse.
Stilgar
Titolo: Re:anomalia datamodule??
Inserito da: schumi - Agosto 04, 2015, 01:10:33 pm
Citazione
Shumi. Se vuoi tenere separate le cose non conviene.

Forse non mi è chiara l'esigenza.

In quel datamodule cosa c'è? La connessione al database o solo componenti "non visibili"? Tipo menu e simili.
A seconda di quello che contengono potrebbe essere il caso di avere politiche di life time diverse.
Stilgar
nel datamodule ci sono oggetti zeoslib (table, query) con relativi datasource e codice per inserire/salvare/cancellare nel db

esempio:ho una tabella clienti e datasource collegato nel datamodule, nella form ho un tbedit che punta ad un campo della tabella.
il mio problema è aprire N volte la form in maniera indipendente l'una dall'altra.
ora ci sono riuscito a modo "mio", quindi nomorelogic mi sta dando la sua versione.

se qualcuno vuol contribuire è ben accetto (nel forum ufficiale c'è poco sull'argomento e NON provengo da delphi).

grazie ;)
Titolo: Re:anomalia datamodule??
Inserito da: Stilgar - Agosto 04, 2015, 01:29:00 pm
Si possono mettere in campo moltissime strategie.
Quella che indicava nomore è la più semplice.
A questo punto suggeriei si pensare in design pattern. Con un bel MVC. Tanto per incasinare lo scenario. :D

Un esempio al volo:
Codice: [Seleziona]

TController = class(TDataModule)
//...
property View : TFormViewEditor;
property Model : TDataModuleZeos;

End;


In questo modo quando hai bisogno di una nuova "finestra" crei un nuovo controller.
Il vantaggio è che potresti anche assegnare più viste identiche allo stesso controller.

Codice: [Seleziona]

TController = class(TDataModule)
//...
property Views :array of TFormViewEditor;
property Model : TDataModuleZeos;

End;


Il controller intercetta il focus delle varie viste e salva lo stato del dataset che viene puntato dalla form selezionata.

In questo modo eviti di avere un numero esagerato di cursori aperti.

Poi se il database è robusto e la connessione è buona, puoi anche avere più cursori aperti, ma ho il timore che si possano "incartare" e una modifica fatta con un cursore va a finire su un altro :D

Il controller servirebbe proprio a fare da "proxy" sulle richieste di modifica e lettura, in modo che ci sia un solo cursore aperto e si va a lavorare proprio su quello.

Stilgar.