* * * *

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, 06:50:37 am

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

75 Visitatori, 0 Utenti

Autore Topic: mie utility su database  (Letto 4390 volte)

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:mie utility su database
« Risposta #30 il: Agosto 31, 2022, 04:43:49 pm »
Inghippo scoperto, almeno credo.

Nella procedura DataModuleCreate ho sospeso l'istruzione  "ZConnectionX1:= TZConnection.Create(nil);".
Ho riprovato e questa volta l'Errore logico sulla Select non è più comparso. Il programma è andato avanti bene.
Codice: [Seleziona]
implementation

{$R *.lfm}

{ TDataModule1 }
uses
  FrmMain;

procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
//  ZConnectionX1:= TZConnection.Create(nil);        <--- refiuso della prima prova, fatta prima di aggiungere gli oggetti ZEOS
  ZConnectionX1.Database := FrmMain.dbCorr;
  ZConnectionX1.Connected:= True;
end;                           
ciao ciao

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:mie utility su database
« Risposta #31 il: Settembre 02, 2022, 11:08:16 pm »
Bene, il ModuloDati comincia ad assumere una sua dimensione propria all'interno di uno dei miei programmi che accedono allo stesso DB.

Ritengo però che debba ancora migliorare la personalizzazione, perchè, come dicevo prima, i programmi in cui devo richiamare il ModuloDati sono già due, ma sicuramente aumenteranno di numero.

Attualmente per accedere al ModuloDati ho inseirto una use nella sezione Implementation, perchè il file ModuloDati.bas (cioè  UModuloDatiDB.pas) ed il corrispendente ModuloDati.lfm (cioè UModuloDatiDB.lfm) sono nella stessa directory del progetto
Codice: [Seleziona]
$ ls /media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/DomusRatio
Appunti_programma    frm3.lfm  frmmain.lfm
backup               frm3.pas  frmmain.pas
bin                  frm4.lfm  griglia_e_matita.jpg
DomusRatioForm2.png  frm4.pas  grigliaMovvCto_2.png
DomusRatio.ico       frm5.lfm  grigliaMovvCto.png
DomusRatio.lpi       frm5.pas  grigliaMovv.png
DomusRatio.lpr       frm6.lfm  imgdef_domusRatio.png
DomusRatio.lps       frm6.pas  lib
DomusRatio.res       frm7.lfm  UModuloDatiDB.lfm
frm2_20211026.pas    frm7.pas  UModuloDatiDB.pas
frm2.lfm             frm8.lfm
frm2.pas             frm8.pas

Il ModuloDati, può contenere anche procedure o funzioni per la lettura di certi dati di uso ordinario da parte di più programmi (NON contemporaneamente attivi)?

La directory del ModuloDati può risiedere in un percorso superiore a quello del programma corrente (Es.: /media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/)?

Io ho pensato di sì ed ho cercato di realizzare un collegamento dei programmi al ModuloDati comune, tramite una dichiarazione use nella sezione Interface di ciascun programma e l'aggiunta del nuovo percorso nella finestra dell'IDE "Progetto -> Opzioni Progetto -> Percorsi -> Altri file unit", ma ho incontrato diversi ostacoli dovuti a manifestazioni di Errori. Ho dovuto perciò fare marcia indietro e dedicarmi all'utilizzo del ModuloDati, intanto, nel progetto in cui sono impegnato, ma, dopo essere riuscito a compilarlo, senza errori, vorrei apportare le modifiche necessarie per poterlo impiegare anche in altri progetti, senza doverlo riscrivere all'interno di ciascun nuovo progetto.

Spero di avere chiarito il mio concetto.



ciao ciao

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1266
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:mie utility su database
« Risposta #32 il: Settembre 03, 2022, 11:18:19 am »
l'aggiunta del nuovo percorso nella finestra dell'IDE "Progetto -> Opzioni Progetto -> Percorsi -> Altri file unit",

La procedura che hai fatto è corretta. I file interessati DEVONO ESSERE RIMOSSI DALLA DIRECTORY CORRENTE E SPOSTATI NELLA DIRECTORY INDICATA in "Altri file uint".

ma ho incontrato diversi ostacoli dovuti a manifestazioni di Errori.

Gli errori sono dovuti probabilmente ad una non completa esecuzione della procedura. In particolare dal tuo progetto corrente (ANALIZZATORE PROGETTI) devi togliere i due file del Datamodule.

L'inserimento dei due file nel progetto (devi eventualmente aggiungerli dal nuovo percorso) non è indispensabile, essendo file comuni a più progetti è meglio che non appaiano direttamente nella lista di alcun progetto (come fossero file di sistema di FPC).

Se hai problemi con la compilazione, prova ad inserirli manualmente nel progetto (non ho mai provato a condividere unita con form).

Ciao

:) Ogni alba è un regalo, ogni tramonto è una conquista :)

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:mie utility su database
« Risposta #33 il: Settembre 03, 2022, 04:02:08 pm »
@ DragoRosso

Grazie per l'incoraggiamento.

Ho rimodificato il mio codice creando, all'interno della directory "/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei"  la cartella "modul_dati_db" coi file pertinenti  al modulo-dati. Ho aggiunto la cartella fra i percorsi di ricerca dell'IDE --> Opzioni progetto -> Percorsi -> altri fil unit. Ho allineato tute le uses delle sezioni Interface dei vari file .pas del progetto ed ho compilato.

Dopo avere eseguito la compilazione senza errori, ho trasferito nel file "UModuloDatiDB.pas" del modulo-dati due funzioni che uso spesso, ottenendo il definitivo "UModuloDatiDB.pas":
Codice: [Seleziona]
unit UModuloDatiDB;

{$mode ObjFPC}{$H+}

interface

uses
  Classes, SysUtils, ZCompatibility,
  ZConnection, ZDataset, SQLite3Conn, SQLDB, DB;


type

  { TDataModule1 }

  TDataModule1 = class(TDataModule)
  DataSourceX1: TDataSource;
  ZConnectionX1: TZConnection;
  ZQueryX1: TZQuery;
  ZReadOnlyQueryX2: TZReadOnlyQuery;
  ZReadOnlyQueryX1: TZReadOnlyQuery;

  procedure DataModuleCreate(Sender: TObject);
  function EstraiCoVoColleg(sql, segnal: String): String;
  function EstraiVocePianCont(sql: String): String;
 

private


public

end;

var
  DataModule1: TDataModule1;

implementation

{$R *.lfm}

{ TDataModule1 }
uses
  FrmMain;

procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
  ZConnectionX1.Database := FrmMain.dbCorr;
  ZConnectionX1.Connected:= True;
end;

function EstraiCoVoColleg(sql, segnal: String): String;
var

  estratto: String;

begin
  DataModule1.ZReadOnlyQueryX2.Active:= False;
  DataModule1.ZReadOnlyQueryX2.SQL.Text:= sql;
  DataModule1.ZReadOnlyQueryX2.Active:= True;
  if (DataModule1.ZReadOnlyQueryX2.RecordCount) > 0 then
  begin
    DataModule1.ZReadOnlyQueryX2.First;
    case segnal of
      'S', 'P':
        begin
          estratto:= DataModule1.ZReadOnlyQueryX2.FieldByName('NumVoColleg').AsString;
        end
      else begin
        estratto:= '*?*';   // CODICE DI errore  PER record NON TROVATO
      end;
    end;
  end;
  Result:= estratto;
end;

function EstraiVocePianCont(sql: String): String;    // Estrae la Voce contabile, a cui accoda il contenuto del campo "ContrPartSiNo"
var
  swOpenErro: Boolean = False;

  estratto: String;

begin
  WriteLn('function EstraiVocePianCont');
  DataModule1.ZReadOnlyQueryX2.Active:= False;
  DataModule1.ZReadOnlyQueryX2.SQL.Text:= sql;
  DataModule1.ZReadOnlyQueryX2.Active:= True;
  if (DataModule1.ZReadOnlyQueryX2.RecordCount) > 0 then
  begin
    DataModule1.ZReadOnlyQueryX2.First;
    estratto:= DataModule1.ZReadOnlyQueryX2.FieldByName('NomeVoce').AsString;
    estratto:= estratto + DataModule1.ZReadOnlyQueryX2.FieldByName('ContrPartSiNo').AsString;
  end
  else begin
    estratto:= '*?*';   // CODICE DI errore  PER recor NON TROVATO
  end;
  Result:= estratto;
end;
end.

Ebbene, la chiamata di una qualsiasi delle funzioni appena spostate, produce il seguente messaggio d'Errore:
Citazione
frm6.pas(560,23) Error: Identifier not found "EstraiVocePianCont"
frm6.pas(570,36) Error: Identifier not found "EstraiCoVoColleg"

Non capisco perchè vengono ignorate. Eppure avevo percepito che avrei potuto aggiungere nel modulo-dati anche funzioni e procedure.
ciao ciao

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1266
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:mie utility su database
« Risposta #34 il: Settembre 03, 2022, 05:49:53 pm »
@ DragoRosso


Codice: [Seleziona]
......
procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
  ZConnectionX1.Database := FrmMain.dbCorr;
  ZConnectionX1.Connected:= True;
end;

function TDataModule1.EstraiCoVoColleg(sql, segnal: String): String;
var

  estratto: String;

begin
  DataModule1.ZReadOnlyQueryX2.Active:= False;
  DataModule1.ZReadOnlyQueryX2.SQL.Text:= sql;
  DataModule1.ZReadOnlyQueryX2.Active:= True;
  if (DataModule1.ZReadOnlyQueryX2.RecordCount) > 0 then
  begin
    DataModule1.ZReadOnlyQueryX2.First;
    case segnal of
      'S', 'P':
        begin
          estratto:= DataModule1.ZReadOnlyQueryX2.FieldByName('NumVoColleg').AsString;
        end
      else begin
        estratto:= '*?*';   // CODICE DI errore  PER record NON TROVATO
      end;
    end;
  end;
  Result:= estratto;
end;

function TDataModule1.EstraiVocePianCont(sql: String): String;    // Estrae la Voce contabile, a cui accoda il contenuto del campo "ContrPartSiNo"
var
  swOpenErro: Boolean = False;

  estratto: String;

begin
  WriteLn('function EstraiVocePianCont');
  DataModule1.ZReadOnlyQueryX2.Active:= False;
  DataModule1.ZReadOnlyQueryX2.SQL.Text:= sql;
  DataModule1.ZReadOnlyQueryX2.Active:= True;
  if (DataModule1.ZReadOnlyQueryX2.RecordCount) > 0 then
  begin
    DataModule1.ZReadOnlyQueryX2.First;
    estratto:= DataModule1.ZReadOnlyQueryX2.FieldByName('NomeVoce').AsString;
    estratto:= estratto + DataModule1.ZReadOnlyQueryX2.FieldByName('ContrPartSiNo').AsString;
  end
  else begin
    estratto:= '*?*';   // CODICE DI errore  PER recor NON TROVATO
  end;
  Result:= estratto;
end;
end.

Ebbene, la chiamata di una qualsiasi delle funzioni appena spostate, produce il seguente messaggio d'Errore:
Citazione
frm6.pas(560,23) Error: Identifier not found "EstraiVocePianCont"
frm6.pas(570,36) Error: Identifier not found "EstraiCoVoColleg"

Non capisco perchè vengono ignorate. Eppure avevo percepito che avrei potuto aggiungere nel modulo-dati anche funzioni e procedure.

NELLA IMPLEMENTATION: DEVI IMPLEMENTARE LE FUNZIONI CON L'INTESTAZIONE "TDATAMODULE1." !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Visto che appartengono a quella classe.

« Ultima modifica: Settembre 03, 2022, 05:51:31 pm da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:mie utility su database
« Risposta #35 il: Settembre 03, 2022, 10:50:21 pm »
NELLA IMPLEMENTATION: DEVI IMPLEMENTARE LE FUNZIONI CON L'INTESTAZIONE "TDATAMODULE1." !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Visto che appartengono a quella classe.
Ho fatto come mi hai indicato, ma il messaggio d'Errore ricompare tale e quale:
Codice: [Seleziona]
unit UModuloDatiDB;

{$mode ObjFPC}{$H+}

interface

uses
  Classes, SysUtils, ZCompatibility,
  ZConnection, ZDataset, SQLite3Conn, SQLDB, DB;


type

  { TDataModule1 }

  TDataModule1 = class(TDataModule)
  DataSourceX1: TDataSource;
  ZConnectionX1: TZConnection;
  ZQueryX1: TZQuery;
  ZReadOnlyQueryX2: TZReadOnlyQuery;
  ZReadOnlyQueryX1: TZReadOnlyQuery;

  procedure DataModuleCreate(Sender: TObject);
  function EstraiCoVoColleg(sql, segnal: String): String;
  function EstraiVocePianCont(sql: String): String;

private

public

end;

var
  DataModule1: TDataModule1;

implementation

{$R *.lfm}

{ TDataModule1 }

procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
  ZConnectionX1.Connected:= True;
end;

function TDataModule1.EstraiCoVoColleg(sql, segnal: String): String;    // Estrae dalla Tabella "racodvoci" il codice di sottoconto contrappoto al tipo inmdicato in "segnal":
//                                                           se "segnal = "S" o "P", la viariabile "coVoSotCto" contiene un codice di Sottoconto di Cassa
//                                                           se "segnal = "N", la viariabile "coVoSotCto" contiene un codice di Sottoconto di Contropartita
var

  estratto: String;

begin
  DataModule1.ZReadOnlyQueryX2.Active:= False;
  DataModule1.ZReadOnlyQueryX2.SQL.Text:= sql;
  DataModule1.ZReadOnlyQueryX2.Active:= True;
  if (DataModule1.ZReadOnlyQueryX2.RecordCount) > 0 then
  begin
    DataModule1.ZReadOnlyQueryX2.First;
. . .
end;

function TDataModule1.EstraiVocePianCont(sql: String): String;    // Estrae la Voce contabile, a cui accoda il contenuto del campo "ContrPartSiNo"
var
  swOpenErro: Boolean = False;

  estratto: String;

begin
. . .
Citazione
frm6.pas(614,19) Error: Identifier not found "EstraiVocePianCont"
frm6.pas(627,23) Error: Identifier not found "EstraiVocePianCont"
ciao ciao

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1266
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:mie utility su database
« Risposta #36 il: Settembre 04, 2022, 12:27:14 am »
Non puoi usare in quel modo le due funzioni. Appartengono ad una classe e devi usarle con l'istanza della classe:

Codice: [Seleziona]
 strimia := classe.EstraiVocePianCont(sql);
« Ultima modifica: Settembre 04, 2022, 12:33:45 am da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:mie utility su database
« Risposta #37 il: Settembre 04, 2022, 10:30:01 am »
Non puoi usare in quel modo le due funzioni. Appartengono ad una classe e devi usarle con l'istanza della classe:

Codice: [Seleziona]
 strimia := classe.EstraiVocePianCont(sql);
L'avevo provata pure, ma mi da sempre Errore:
Codice: [Seleziona]
striMia:= TDataModule1.EstraiVocePianCont(sql);          <---  così da l'Errore riportato sotto
                     
Citazione
frm6.pas(614,55) Error: Only class methods, class properties and class variables can be accessed in class methods
frm6.pas(614,55) Error: Only class methods, class properties and class variables can be referred with class references


Però
Codice: [Seleziona]
striMia:= DataModule1.EstraiVocePianCont(sql);            <---  così funziona
                     

ciao ciao

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:mie utility su database
« Risposta #38 il: Settembre 04, 2022, 11:53:13 am »
Purtroppo non è finita.

Ho ancora difficoltà perchè non riesco ad impostare il percorso del mio database.
Nel modulo-dati, avevo  impostato il percorso così:
Codice: [Seleziona]
uses
  FrmMain;

procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
  ZConnectionX1.Database := FrmMain.dbCorr;
  ZConnectionX1.Connected:= True;
end;

E funzionava, però mi sono reso conto che il modulo dati rimaneva agganciato al progetto utente per via della "uses FrmMain", dove sono in grado di capire quale database fra (dbOrig e dbProve) è quello attivo.

Ho voluto perciò togliere quel vincolo. Per farlo, ho pensato di definire nel modulo-dati una variabile (UdbCorr) da valorizzare nella procedure TForm1.FormCreate del progetto utente.

dichiarazione variabile nel modulo dati:
Codice: [Seleziona]
unit UModuloDatiDB;

{$mode ObjFPC}{$H+}

interface

uses
  Classes, SysUtils, ZCompatibility,
  ZConnection, ZDataset, SQLite3Conn, SQLDB, DB;


type

  { TDataModule1 }

  TDataModule1 = class(TDataModule)
  DataSourceX1: TDataSource;
  ZConnectionX1: TZConnection;
  ZQueryX1: TZQuery;
  ZReadOnlyQueryX2: TZReadOnlyQuery;
  ZReadOnlyQueryX1: TZReadOnlyQuery;

  procedure DataModuleCreate(Sender: TObject);
  function EstraiCoVoColleg(sql, segnal: String): String;
  function EstraiVocePianCont(sql: String): String;
 

private

public
var
  UdbCorr: String;

end;

var
  DataModule1: TDataModule1;


implementation

{$R *.lfm}

{ TDataModule1 }
//uses
//  FrmMain;


procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
//  ZConnectionX1.Connected:= False;
//  ZConnectionX1.Database := FrmMain.dbCorr;
  ZConnectionX1.Database := UdbCorr;
  ZConnectionX1.Connected:= True;
end;                                                 

Poi nel progetto utente ho scritto:
Codice: [Seleziona]
procedure TForm1.FormCreate(Sender: TObject);
var
begin
. . .
//------------------------------------ Assegno percorso per l'accesso al DB corretto
  dbCopia:= '/media/dirdati/dativari/contabfam/ContabFamdb(copia)';       
  dbOrig:= '/media/dirdati/dativari/contabfam/ContabFamdb';
  dbProve:= '/media/dirdati/dativari/contabfam/ContabFamdb_prove';     
//------------------------------------------------------------------------------------
  DataModule1.UdbCorr:= dbProve;                             
Ebbene, ques'ultima istruzione provoca il seguente Errore:
Citazione
Il progetto DomusRatio ha sollevato una eccezione di classe 'External: SIGSEGV'.
 All'indirizzo 42A20E
Ho provato a spostare la dichiarazione della variabile nel modulo-dati ma inutilmente. Anche questa volta  non ho capito come risolvere.
ciao ciao

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1266
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:mie utility su database
« Risposta #39 il: Settembre 04, 2022, 02:10:33 pm »
TI HO GIA' SCRITTO IN UN PRECEDENTE POST CHE NON PUOI CHIAMARE IL DATAMODULE DALLA FORM CREATE !!!!

Quella classe non è ancora stata istanziata. PER L'ENNESIMA VOLTA TORNO A RIPETERTI CHE DEVI FARE ATTENZIONE ALLA SEQUENZA DI CREAZIONE DEGLI OGGETTI.
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:mie utility su database
« Risposta #40 il: Settembre 07, 2022, 08:29:42 am »
In linea di principio hai ragione, se è l'ide a gestire l'ordine di creazione nel file principale.


Poi si può sempre intervenire e alterare l'ordine di creazione da ide o (come preferisco) a manina.




Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1266
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:mie utility su database
« Risposta #41 il: Settembre 07, 2022, 09:06:10 am »
Volendo proprio dire, io preferisco istanziare a "mano" tutto quello che mi serve "subito", per esempio i datamodule io li istanzio sempre a mano in quanto normalmente dai DB leggo parte della configurazione del software.

Alterare la sequenza di "inizializzazione" delle unità non sposta il problema dell'attenzione alla creazione degli oggetti, inoltre ha degli effetti secondari non trascurabili come ad esempio spostare la "FORM" di riferimento dell'applicazione (Form che quando chiusa provoca automaticamente la chiusura dell'applicazione). Inoltre c'è da tenere presente che "Thread Principale", "Pompa dei Messaggi" e altro seguono la Form principale, Form che per definizione  è la prima nella sequenza di creazione e che ha appunto alcune peculiarità tipiche.

Comunque và adattato il proprio modo di programmare sulla base dei principi logici dell'applicazione e avendo ben chiare alcune regole basilari della programmazione ad oggetti e di come l'ambiente runtime gestisce le varie fasi di avvio di una applicazione.

Come ultima nota, prima di scrivere codice sarebbe utile farsi un diagramma di flusso con le varie fasi di attività dell'applicazione, cosa che oltre che consigliato e direi obbligatorio per chiunque si occupi di programmazione aiuta sicuramente ad organizzare poi il codice.

Ciao
« Ultima modifica: Settembre 07, 2022, 09:07:46 am da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

 

Recenti

How To

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

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.