* * * *
24 Visitatori, 0 Utenti

Autore Topic: data module  (Letto 585 volte)

schumi

  • Full Member
  • ***
  • Post: 130
  • Karma: +0/-0
data module
« il: Marzo 05, 2018, 10:30:13 am »
Buongiorno,
ho un piccolo dilemma e non trovo niente in rete che fa al caso mio.
ho creato una form per gestire dei documenti (DDT, Fatture ecc) e un data module con anche tutto il codice per inserire modificare ecc.
Nella form dichiaro nelle variabili il mio DM e nel metodo formcreate uso il create(self), in formShow invece richiamo un metodo del DM che apre il filtro su DDT o fatture ecc.
Funziona tutto bene salvo quando apro 2 form, una ad esempio per DDT e una per Fatture, la seconda form apre gli stessi documenti della prima come se utilizzasse la stessa istanza della prima. Nella mia 'gnoranza credevo che un qualsiasi oggetto , anche un DM, potesse essere aperto ex-novo tutte le volte che si vuole e in maniera indipendente.
Uso ZeosLib su DB PostgreSql con una sola connessione al DB per tutte le query.
Dove sbaglio?

ricapitolando:
var
  frmDocumenti: TfrmDocumenti;
  dmDocumenti: TdmDocumenti; 

nel formcreate
dmDocumenti := TdmDocumenti.Create(self);

nel formshow
dmDocumenti.apri_Documenti(cTipo_documento) ;

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 2444
  • Karma: +6/-0
Re:data module
« Risposta #1 il: Marzo 05, 2018, 03:52:20 pm »
Ciao Schumi, il problema, è che istanzi la finestra una volta, e quindi quando generi l'evento show della finestra ti apre sempre la stessa istanza. Tu devi creare un array di TfrmDocumenti.

var
  dmDocumenti: array of TdmDocumenti; 

E poi

nel formshow

SetLength(dmDocumenti,Length(dmDocumenti)+1);
dmDocumenti[Length(dmDocumenti)-1] := TdmDocumenti.Create(self);
dmDocumenti[Length(dmDocumenti)-1].apri_Documenti(cTipo_documento) ;

nel form hide devi poi fare un

for i := 0 to Length(dmDocumenti)-1
begin
   dmDocumenti[Length(dmDocumenti)-1].Free;
end;
Ieri è passato, domani è futuro, oggi è un dono...

schumi

  • Full Member
  • ***
  • Post: 130
  • Karma: +0/-0
Re:data module
« Risposta #2 il: Marzo 05, 2018, 07:52:25 pm »
faccio qualche prova con la tecnica degli array, vediamo se mi incarto.

grazie
ciao

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1811
  • Karma: +4/-0
Re:data module
« Risposta #3 il: Marzo 05, 2018, 10:14:30 pm »
Ma non serve  array.
Nel senso crei la form associata ad un'applicazione. Questa viene messa nella lista dei componenti dell'applicazione. Se fai un array crei un doppione.
Banalmente:
Codice: [Seleziona]
Application.createform (tipoform variabileform);
Variabileform.show;
Nella form puoi mettere un onclose che faccia la pulizia della memoria.
Lavori solo con una varibile alla volta. Il framework fa il resto.😉
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1811
  • Karma: +4/-0
Re:data module
« Risposta #4 il: Marzo 05, 2018, 10:18:19 pm »
Magari metti una property nella form figlia in modo da discriminare il tipo di documento da aprire prima di fare la show.
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

schumi

  • Full Member
  • ***
  • Post: 130
  • Karma: +0/-0
Re:data module
« Risposta #5 il: Marzo 05, 2018, 11:29:46 pm »
la form la creo al bisogno, quindi

var fmDocumenti: TfrmDocumenti;
....
fmDocumenti := TfrmDocumenti.Create(Self);
fmDocumenti.cTipo_documento := tipo_documento ;

fmDocumenti.show;
oppure
TDIMain.ShowFormInPage( fmDocumenti, 5 );
visto che sto testando l' interfaccia TDI con discreta soddisfazione.

ecco perché la funzione apri_documenti lo lancio nel show, il tipo documento è una variabile pubblica e finché non creo la form non esiste.

ora ho cambiato creando una property e una procedura SetTipoDocumento che lancia apri_documenti(), dmDocumenti è nella dichiarazione private, ma il risultato non cambia (anche se codice mi piace di più).

comunque se richiamo lo stesso datamodule da un'altra form che lancia altri metodi la storia si ripete.
dilemma ancora irrisolto, 2 form possono aprire lo stesso datamodule in maniera indipendente l'una dall'altra?
form1
form2
data1 che contiene query1
form1 lancia una select con query1
form2 lancia una select diversa sempre con query1

grazie
ciao

schumi

  • Full Member
  • ***
  • Post: 130
  • Karma: +0/-0
Re:data module
« Risposta #6 il: Marzo 06, 2018, 09:24:34 am »
trappolando un po' ho capito che il problema sono i datasource che ho messo direttamente nel datamodule.
consigliate di spostarli nella form?

grazie
ciao

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1811
  • Karma: +4/-0
Re:data module
« Risposta #7 il: Marzo 06, 2018, 09:28:34 am »
Ma no. Al massimo fai un data module nuovo per ogni form.
La form tiene il riferiamo al suo data module in modo da distruggerlo in chiusura.
In alternativa crei i datamodule che creano la form e si distruggono al freenotification della form collegata.
Ci sono tante opzioni per non spostare i dataset 😊
« Ultima modifica: Marzo 06, 2018, 10:41:16 am da Stilgar »
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

schumi

  • Full Member
  • ***
  • Post: 130
  • Karma: +0/-0
Re:data module
« Risposta #8 il: Marzo 06, 2018, 10:43:17 am »
ma in realtà si crea un datamodule nuovo per ogni form, le query sono corrette, mentre il datasource visualizza sempre le info del primo datamodule aperto.
spostando il dataset nella form pare funzionare tutto, solo un po' macchinoso creare i collegamenti:
datasource1.dataset := DataModule1.query1;

non trovo esempi evoluti di come utilizzare i datamodule, ma forse non li so cercare  ::) ::)

schumi

  • Full Member
  • ***
  • Post: 130
  • Karma: +0/-0
Re:data module
« Risposta #9 il: Marzo 06, 2018, 12:05:10 pm »
credo di aver risolto....San Google e un po' di apertura mentale (ho cercato come delphi)
ho trovato questo esempio su StackOverflow

if FDataModule = nil then
  begin
    FDataModule := TMyDataModule.Create(Self);
    FDataModule.Name := '';  // That will avoid pointing to the same datamodule
  end;

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1811
  • Karma: +4/-0
Re:data module
« Risposta #10 il: Marzo 06, 2018, 12:09:48 pm »
Allora.
Di base Form e DataModule sono componenti.
Ogni componente notifica quando viene distrutto. (FreeNotification).
Se il datamodule che istanzi, crea la form, basta mettere una property al datamodule con la form appena creata.
Aggiungi la onClose che distrugga l'istanza l'istanza.
Codice: [Seleziona]
 protected procedure TComponent.Notification( AComponent: TComponent; Operation: TOperation); virtual;
A questo metodo arrivano tutte le notifiche di distruzione e creazione dei componenti.
Quindi calando nel contesto il discorso.
Codice: [Seleziona]
TDataModuleController=class(TDataModule)
protected
   FView : TForm;
....
public
  property TargetView : TForm;
protected
  procedure Notification( AComponent: TComponent; Operation: TOperation); override;
...
  constructor Create(AOwner : TComponent);
end.

Constructor TDataModuleController.Create;
begin
  inherited Create(aOwner);
  Application.CreateForm(TForm, FView);
  FView.FreeNotification(self);
end;

procedure TDataModuleController.Notification( AComponent: TComponent; Operation: TOperation);
begin
  if (operation = opRemove) and (aComponent=FView) then
  begin
  FView := nil; // pulisci solo il riferimento, non eliminarlo, altrimenti incorri in errori di violazione.
   Destroy;
  end;
end;

Logicamente tutti i dataset e datasource li devi assegnare correttamente. Altrimenti comanda la configurazione fatta graficamente.
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1811
  • Karma: +4/-0
Re:data module
« Risposta #11 il: Marzo 06, 2018, 12:10:52 pm »
Codice: [Seleziona]
   FDataModule.Name := '';  // That will avoid pointing to the same datamodule
Questo serve a non far scattare un errore di "Nome duplicato"...
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

schumi

  • Full Member
  • ***
  • Post: 130
  • Karma: +0/-0
Re:data module
« Risposta #12 il: Marzo 06, 2018, 02:28:29 pm »
Nel mio caso sono le form che aprono i DM, per semplificare e non ripetere codice uso lo stesso DM su più form, il problema era che aprendo 2 o più form con lo stesso DM i dataset visualizzavano i dati della prima form aperta. Con la piccola modifica sopra il problema è scomparso.
Ammetto che ho risolto per tentativi non avendo cultura delphi alle spalle, solo parecchio turboPascal su DOS. :o :o :o

Manca un articolo sulla gestione "avanzata" dei DM (i tutorial che ho trovato in rete sono solo basici).
se qualcuno se la sente di cimentarsi.... ;) ;)

grazie

 

Recenti

How To

Trascinare un file nel programma da xinyiman
DB concetti fondamentali e ZeosLib da xinyiman
Recuperare codice HTML da pagina web da xinyiman
Mandare mail con Lazarus da xinyiman
Stabilire il sistema operativo da xinyiman
Esempio lista in pascal da xinyiman
File INI da xinyiman
Codice di attivazione da xinyiman
Realizzare programmi multilingua da xinyiman
Lavorare con le directory da xinyiman
Utilizzare Unità esterne da Loryea
TTreeView da xinyiman
TTreeview e Menu da xinyiman
Generare controlli RUN-TIME da xinyiman
LazReport, PDF ed immagini da xinyiman
Intercettare tasti premuti da xinyiman
Ampliare Lazarus da xinyiman
Lazarus e la crittografia da xinyiman
System Tray con Lazarus da xinyiman
UIB: Unified Interbase da Microges2000
Il file: questo sconosciuto da Microges2000
Conferma di chiusura di un applicazione da xinyiman
Liste e puntatori da Microges2000
Overload di funzioni da Microges2000
Funzioni a parametri variabili da Microges2000
Proprietà da Microges2000
Conversione numerica da Microges2000
TImage su Form e Panel da Maverich
Indy gestiore server FTP lato Client da Maverich
PopUpMenu sotto Pulsante (TSpeedButton) da Maverich
Direttiva $macro da Microges2000
Toolbar da xinyiman
Evidenziare voci TreeView da Maverich
Visualizzare un file Html esterno da Maverich
StatusBar - aggirare l'errore variabile duplicata da Maverich
Da DataSource a Excel da xinyiman
Le permutazioni da xinyiman
Brute force da xinyiman
Indy 10 - Invio email con allegati da Maverich
La gestione degli errori in Lazarus da xinyiman
Pascal Script da xinyiman
Linux + Zeos + Firebird da xinyiman
Dataset virtuale da xinyiman
Overload di operatori da Microges2000
Lavorare con file in formato JSON con Lazarus da nomorelogic
Zeos ... dietro le quinte (prima parte) da Stilgar
Disporre le finestre in un blocco unico (come Delphi) da Maverich
Aspetto retrò (Cmd Line) da xinyiman
Come interfacciare periferica twain da Narciso
Ubuntu - aggiornare free pascal e lazarus da xinyiman
fpcup: installazioni parallele di lazarus e fpc da nomorelogic
Free Pascal e Lazarus sul Raspberry Pi da nomorelogic
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal. da nomorelogic
Creare un server multithread da xinyiman
guida all'installazione di fpc trunk da subversion in linux gentoo da nomorelogic
Indice da nomorelogic
DB concetti fondamentali e connessioni standard da xinyiman
Advanced Record Syntax da nomorelogic
DB concetti fondamentali e DBGrid da xinyiman
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText da xinyiman
Advanced Record Syntax: un esempio pratico da nomorelogic
Superclasse form base per programmi gestionali (e non) da nomorelogic
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox da nomorelogic
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form da nomorelogic
Superclasse form base per programmi gestionali (e non) #4 - wait animation da nomorelogic
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog da nomorelogic
Installare lazarus su mac osx sierra da xinyiman
Utenti
  • Utenti in totale: 577
  • Latest: sjmon
Stats
  • Post in totale: 11630
  • Topic in totale: 1446
  • Online Today: 29
  • Online Ever: 74
  • (Luglio 09, 2012, 11:05:53 am)
Utenti Online
Users: 0
Guests: 24
Total: 24

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.