Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: petrusic - Settembre 05, 2021, 03:13:41 pm

Titolo: [Risolto] ancora problemi sulle variabili globali
Inserito da: petrusic - Settembre 05, 2021, 03:13:41 pm
Mel programma che ho in costruzione ho definito nella unit FrmMain alcune costanti e variabili globali:
Codice: [Seleziona]
unit FrmMain;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, DB, Forms, Controls, Graphics, Dialogs, Menus, ExtCtrls,
  fileutil, ZConnection, ZDataset, Frm2, Frm5,
  ZDbcIntfs;    // necezzario per accedere ai componenti "IZ" contenuti nel pacchetto zdbc.lpk;

type

    { TForm1 }

    TForm1 = class(TForm)
    DataSource1: TDataSource;
    Image1: TImage;
    MainMenu1: TMainMenu;
    Menu1: TMenuItem;
...
    Menu2225: TMenuItem;
    ZConnection1: TZConnection;
    ZQuery1: TZQuery;
    procedure FormCreate(Sender: TObject);
...
    procedure Menu2225Click(Sender: TObject);
  private

  public

  end;
const
  CurrentProtocol = 'sqlite';
var
  Form1: TForm1;

  dbCopia: String = '/media/dirdati/dativari/contabfam/ContabFamdb(copia)';
  dbOrig: String = '/media/dirdati/dativari/contabfam/ContabFamdb';
  dbProve: String = '/media/dirdati/dativari/contabfam/ContabFamdb_prove';
  dbCorr: String;
  sql, striMia: String;

implementation

Tutte le variabili dichiarate nella sezione "Interface" sono, per quanto appreso, globali e, quindi , visibili in tutte le unit del progetto.
Nella unit "utilmiedb", la quale è richiamata fra le use della unit Frm5  faccio uso della variabile "dbCorr", :
Codice: [Seleziona]
unit Frm5;    // Form5 - Tabelle Disordinate

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
  utilmie, utilmiedb;
type

Codice: [Seleziona]
unit utilmiedb;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils,
  ZConnection, ZDataset,
  ZDbcIntfs;    // necezzario per accedere ai componenti "IZ" contenuti nel pacchetto zdbc.lpk;

type
  TstrOut = Integer;

function contElemTbX(nmTabDb: String): TstrOut;

implementation

function contElemTbX(nmTabDb: String): TstrOut;
const
CurrentProtocol = 'sqlite';

var
//  --------------------- componenti "IZ" utilizzati e contenuti nel pacchetto zdbc.lpk; ---------------------
  FConn: IZConnection;
  stmt: IZStatement;
  rs: IZResultSet;
// -----------------------------------------------------------------------------------------------------------
  totRecQry: Integer;

  dtPrec, sql, striMia: String;

begin
  striMia:= DriverManager.ConstructURL(CurrentProtocol, '', dbCorr, '', '', 0, nil);
  FConn:= DriverManager.GetConnection(striMia);  // prepara l’accesso al DB, cercandolo
  stmt:= FConn.CreateStatement;  // eseguela Open del DB
//-----------                                               

Nonostante io abbia la presunzione di avere osservato attentamente le indicazioni lette, ricevo, in compilazione,  il seguente messaggio d'Errore:
Citazione
utilmiedb.pas(35,61) Error: Identifier not found "dbCorr"
:o
Dove ho sbagliato?
Titolo: Re:ancora problemi sulle variabili globali
Inserito da: bonmario - Settembre 05, 2021, 06:22:37 pm
Se ho visto bene, nella "utilmiedb" ti sei dimenticato la uses di "FrmMain", quindi non puoi usare niente di quella unit.

Ciao, Mario
Titolo: Re:ancora problemi sulle variabili globali
Inserito da: petrusic - Settembre 05, 2021, 07:37:39 pm
No, non è quello. L'ho aggiunto, ma mi ha dato il seguente errore
Citazione
utilmiedb.pas(8,29) Fatal: Circular unit reference between utilmiedb and FrmMain
Titolo: Re:ancora problemi sulle variabili globali
Inserito da: bonmario - Settembre 06, 2021, 08:03:07 am
Correggimi se sbaglio:
nella "utilmiedb" stai cercando di usare la variabile "dbCorr", che hai dichiarato nella unit "FrmMain".
E' così?
Se la risposta è sì, il problema è proprio quello che ti ho scritto ieri. Con una piccola precisazione però ...
Visto l'errore che ti ha dato, la "uses FrmMain" non la devi aggiungere in testa, ma subito dopo la "implementation".

Questo proprio per evitare l'errore che ti ha dato in compilazione: se la unit A usa la unit B, la unit B non può usare la A, a meno che la uses la si metta dopo la implementation

Ciao, Mario
Titolo: Re:ancora problemi sulle variabili globali
Inserito da: petrusic - Settembre 06, 2021, 09:35:17 am
se la unit A usa la unit B, la unit B non può usare la A, a meno che la uses la si metta dopo la implementation
Questa non me l'aspettavo. In quello che ho letto sulle variabili globali, non ho incontrato nessuna indicazione in merito.

Ho, allora, provato il tuo suggerimento, aggiungendo una seconda "uses" subito dopo la riga di "implementation" della unit "utilmiedb":
 :D
Ha funzionato!

Grazie per avermi aiutato e diventare meno ignorante.
Titolo: Re:[Risolto] ancora problemi sulle variabili globali
Inserito da: bonmario - Settembre 06, 2021, 12:51:44 pm
Guarda, se penso a come ho "risolto" il tuo stesso problema la prima volta che mi è capitato, mi metto ancora adesso le mani nei capelli !!!

Ciao, Mario
Titolo: Re:[Risolto] ancora problemi sulle variabili globali
Inserito da: petrusic - Settembre 06, 2021, 04:18:13 pm
Guarda, se penso a come ho "risolto" il tuo stesso problema la prima volta che mi è capitato, mi metto ancora adesso le mani nei capelli !!!
Beatto te. Io capelli non ne ho!  ;)