Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi globale variable (https://www.delphipraxis.net/2049-globale-variable.html)

Privateer3000 5. Jan 2003 02:59


globale variable
 
Hi Leuts,

wenn ich in zB: Form1 eine var posit:integer;
deklariere steht sie in Form2 nicht zu Verfügung.
Obwohl in den Units die Forms "sich sehen".Ich meine in Form1 steht
uses: Unit1 usw...
Warum kann ich in Form2 nicht auf sie zugreifen??

Christian Seehase 5. Jan 2003 04:09

Moin Privateer,

wo hast Du die Variable denn deklariert?

Chewie 5. Jan 2003 11:08

Steht die Unit in der uses-Klausel im interface-Teil oder im implementation-Teil? Falls sie im implementation-Teil steht, musst du den Namen der Unit angeben, wenn du sie aus einer anderen Unit aufrufst.

sakura 5. Jan 2003 11:37

Zitat:

Zitat von Chewie
Falls sie im implementation-Teil steht, musst du den Namen der Unit angeben, wenn du sie aus einer anderen Unit aufrufst.

Falsch, wenn Du die Variabel im implementation-Teil deklariert hast, dann ist diese ausserhalb der UNIT, in welcher diese deklariert wurde nicht verfügbar. Wenn die Variable auch in anderen Units verfügbar sein soll, dann musst Du diese im interface-Teil deklarieren.

Privateer3000 5. Jan 2003 13:12

Moin Leuts,

in diesem Teil steht das:
Code:
private
    { Private-Deklarationen }
    public

  end;

var
  Form1: TForm1;
  blinker,Anzahlsicht,posit,protset: integer;
  BGFarbindex,FontFarbindex: String;
  puff,Durch,Differ: Currency;
  Nexttick: DWORD;
  Comma: Boolean=false;


implementation

uses Unit2,Unit3,Unit4, Unit5;

{$R *.DFM}
und eigentlich muss ich auf all diese Variablen von jedem Form zugreifen,
da hier GRundeinstelluingen stehen.Momentan mach ich das nur mit Tricks, weil ich es nicht anders weiss.

Christian Seehase 5. Jan 2003 14:24

Moin Privateer,

da man sich unter Umständen leicht mal Zirkelbezüge zwischen den Units einhandeln kann, fände ich es eine gute Idee diese Dinge (in diesem Falle die Variablendeklarationen), die global von allen Units aus erreichbar sein müssen in eine eigens dafür erstellte Unit auszulagern.
Die kann dann, im interface Abschnitt, in jede Unit eingebunden werden, die's braucht.

Privateer3000 5. Jan 2003 14:32

Jetzt hast du den Finger genau in eine Wunde gelegt.
Ich habe schon öfters probiert Proceduren uä. auszulagern.
Ich habe es nie geschafft.Immer ging irgendwas nicht.
Auch wenn ich mich an Tuts gehalten habe, habe ich es nicht verstanden.
Wie geht sowas denn nun`???

Hansa 5. Jan 2003 14:52

Hi,

Zitat:

Zitat von Privateer3000
Ich habe schon öfters probiert Proceduren uä. auszulagern.Ich habe es nie geschafft.

Public : für alle zugänglich (aber innerhalb des Projekts). Vielleicht ist es nur die USES Liste :?:

Guß
Hansa

Christian Seehase 5. Jan 2003 15:20

Moin Privateer,

oder aber Du hast vergessen im Interfaceabschnitt die Funktionsaufrufe auch noch zu deklarieren. Was da nicht steht, kann auch von keiner anderen Unit verwendet werden.

z.B.

Delphi-Quellcode:
Unit Test

//....

procedure MeineAllgemeineProzedur;

implementation

procedure MeineAllgemeineProzedur;
begin
  //...
end;
Überall, wo die Unit Test eingebunden wird, sollte man jetzt auf die Prozedure MeineAllgemeineProzedur zugreifen können.

Privateer3000 5. Jan 2003 16:00

mir ging es eigetnlich um die Variablen
Code:
var
  Form1: TForm1;
  blinker,Anzahlsicht,posit,protset: integer;
  BGFarbindex,FontFarbindex: String;
  puff,Durch,Differ: Currency;
  Nexttick: DWORD;
  Comma: Boolean=false;
die ich in jeder Unit bräuchte.
Denn diese enthalten werte für Timer,labels und edits.
Bzw. integer-werte die auf anderen Units gebraucht werden.

Christian Seehase 5. Jan 2003 16:11

Moin Privateer,

na da, wo Du eine Funktion veröffentlichen müsstest, also vor implementation, gehören die Deklarationen hin.

Chewie 5. Jan 2003 17:14

Zitat:

Zitat von sakura
Zitat:

Zitat von Chewie
Falls sie im implementation-Teil steht, musst du den Namen der Unit angeben, wenn du sie aus einer anderen Unit aufrufst.

Falsch, wenn Du die Variabel im implementation-Teil deklariert hast, dann ist diese ausserhalb der UNIT, in welcher diese deklariert wurde nicht verfügbar. Wenn die Variable auch in anderen Units verfügbar sein soll, dann musst Du diese im interface-Teil deklarieren.

Wenn ich die Variable s im interface-Teil von Unit2 deklariere und diese Unit im implementation-Teil von Unit1 in die uses-Klausel einfüge, kann ich mit Unit2.s auf die Variablle zugreifen. Also entweder hab ich doch recht (eher unwahrscheinlich :wink: ) oder ich hab dich falsch verstanden.

sakura 5. Jan 2003 17:20

Eher aneinandervorbei-geschrieben. Es ging um die Deklaration, aber Du hast vom Einsatz (der Implementation) geschrieben. :D

Chewie 5. Jan 2003 17:22

Ja, das kann schon sein. Da ich das alles mehr oder weniger autodidaktisch gelernt hab, mangelts ein bisschen an den genauen Bezeichnungen. :angle2:

Privateer3000 6. Jan 2003 08:47

Gehe ich richtig der Annahme das der interface dann bis zu implementation geht?
Ansonsten habe ich es doch richtig gemacht und trotzdem
ist kein Zugriff möglich :evil:
Auszug:
Code:
private
    { Private-Deklarationen }
    public

  end;

var
  Form1: TForm1;
  blinker,Anzahlsicht,posit,protset: integer;
  BGFarbindex,FontFarbindex: String;
  puff,Durch,Differ: Currency;
  Nexttick: DWORD;
  Comma: Boolean=false;


implementation

uses Unit2,Unit3,Unit4, Unit5;

fiasko 6. Jan 2003 09:14

Zitat:

Zitat von Privateer3000
mir ging es eigetnlich um die Variablen
Code:
var
  Form1: TForm1;
  blinker,Anzahlsicht,posit,protset: integer;
  BGFarbindex,FontFarbindex: String;
  puff,Durch,Differ: Currency;
  Nexttick: DWORD;
  Comma: Boolean=false;
die ich in jeder Unit bräuchte.
Denn diese enthalten werte für Timer,labels und edits.
Bzw. integer-werte die auf anderen Units gebraucht werden.

Ich verstehe nicht ganz wo dein Problem liegt, aber wenn du nirgends ein Typedef aus einem Interfaceabschnitt einer anderen Unit brauchst, bindest du die Units einfach immer nach dem Implementation statement ein. Damit können keine zyklischen Abhängigkeiten entstehen, denn jede Unit kann kompiliert werden (hat dann erstmal externe referenzen auf die Symbole (funktionen,variablen) der Interfaceteile der anderen units), am ende wird das ganze noch zusammengelink und fertig. Du kommst nur in Probleme, wenn du typedefs aus einer anderen Unit schon im Interface teil brauchst, nur dann kann es zu Zyklen kommen. Hoffe das war einigermaßen verständlich...


Thomas


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz