* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

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

Inserisci il nome utente, la password e la durata della sessione.

55 Visitatori, 0 Utenti

Autore Topic: data module  (Letto 3780 volte)

schumi

  • Full Member
  • ***
  • Post: 219
  • Karma: +1/-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: 3249
  • Karma: +12/-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: 219
  • Karma: +1/-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: 2382
  • Karma: +10/-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: 2382
  • Karma: +10/-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: 219
  • Karma: +1/-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: 219
  • Karma: +1/-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: 2382
  • Karma: +10/-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: 219
  • Karma: +1/-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: 219
  • Karma: +1/-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: 2382
  • Karma: +10/-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: 2382
  • Karma: +10/-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: 219
  • Karma: +1/-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

Utenti
  • Utenti in totale: 785
  • Latest: gmax
Stats
  • Post in totale: 18769
  • Topic in totale: 2232
  • Online Today: 95
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 55
Total: 55

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.