Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Variablen in mehreren Units verwenden


hassedelphi - Mo 11.08.03 17:13
Titel: Variablen in mehreren Units verwenden
hi

meine unit ist voll mit unübersichtlichem qtext. also hab ich ein bisschen davon in eine neue Unit gehaun. problem: die variablen:
Zitat:
[Fehler] Unit2.pas(9): Undefinierter Bezeichner: 'Tm2'

hab's mit uses Unit1 versucht (einmal nach interface, einmal nach implementation), funzt aber nicht

kann jmd helfen? :?!?: auch weitere ideen qt auszulagern sind nicht unerwünscht

Moderiert von user profile iconTino: Titel geändert & Topic verschoben


Tryer - Mo 11.08.03 17:20

Wäre vielleicht ganz handlich wenn man ein paar mehr Infos hätte:
Wo ist Tm2 deklariert, und wo wird es benutzt ?


MfG,
Tryer


hassedelphi - Mo 11.08.03 17:59

wird mitten in einer ganz normalen procedur benutzt (selbst erstellt) (unit2) und dann über meinetwegen showmessage ausgegeben (unit1);

ist als globale variable deklariert, und wird über ein editfeld initialisiert.


Tryer - Mo 11.08.03 18:12

Wenn Du Unit1 im implementation-Abschnitt in Unit2 einbindest und Tm2 dann nicht bekannt ist kann die Variable nicht global in Unit1 deklariert sein, das würde sonst funktionieren.

MfG,
Tryer


Terra23 - Mo 11.08.03 18:36

@Hassedelphi: Schau nochmal in deiner Unit 1 nach. Alle Variablen, die nach der Einbindung von Unit1 in Unit2 nitzen willst, müssen global definiert sein und weiterhin würde ich nun an deiner Stelle in Zukunft von vornherein versuchen, meinen Quelltext so leserlich wie möglich zu halten bzw. durch Kommentare & Anmerkungen leserlich zu machen, z.B.:


Delphi-Quelltext
1:
2:
3:
4:
Form1.Button1Click(Sender: TObject);
begin
ShowMessage('Ich habe jetzt den Knopf gedrückt. Bin ich nicht gut?!?'); {Zeigt eine Message auf Knopfdruck}
end;


hassedelphi - Di 12.08.03 08:00

die variable ist global

unit1

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  Form1: TForm1;

implementation
VAR 
  s,sum,mode : integer; 
  cfe,T1,cfl,cgas,m,Tv,Ts,qs,qv : array [1..8of real; 
  Tm1,Tm2,Tm3,Tm4,Tm5,Tm6,Tm7,Tm8,me : real; 
  w : integer; 
  k : array [1..8of integer;


unit2

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
 unit Unit2;

interface

implementation
uses unit1;

procedure test;
begin
 Tm2:=Tm3;
end;

end.


das ganze funzt aber immer noch nich :x


Tryer - Di 12.08.03 08:41

Interface = Schnittstelle nach draussen

Deine vermeindlich globalen Variablen sind also wirklich keine sondern nur innerhalb der Unit1 zugänglich.
Vielleicht tät ein Blick in die Hilfe ganz gut bzgl. der verschiedenen Unit-Abschnitte.
Ein Blick hierdrauf [http://www.grundlagen.delphi-source.de/styleguide/index.shtml] könnte auch nicht schaden.

Wenn ich deinen QT so anschaue weis ich warum ich nicht viel von globalen Variablen halte und lieber OOP betreibe :autsch:

MfG,
Tryer


hassedelphi - Di 12.08.03 09:45

uhu danke, funzt :D :D

was is ein OOP?


Tryer - Di 12.08.03 10:32

Objekt Orientierte Programmierung

Heißt:
Statt einfache globale Variablen zu nehmen die zu jedem Zeitpunkt aus beliebigen Units überschrieben werden können erstelle ich mir lieber Objekt-Instanzen bei denen der Zugriff auf die Felder über Methoden und Eigenschaften kontrollierbar ist.
Gleichzeitig erreicht man damit eine deutlich bessere Strukturierung des QT´s, da logische Teilbereiche sich in eigenen Klassen abgrenzen lassen.
Sicher gibt es einige Variablen die global sein müssen (z.B. HInstance), das ist aber äusserst selten der Fall.

Der grösste Vorteil der OOP ist die Möglichkeit der Vererbung, d.h. Klassen mit ähnlichen Funktionen erben von einer Vorfahr-Klasse die bereits alle Gemeinsamkeiten der späteren Derivate implementiert.
Die vererbten Klassen implementieren dann nur einige wenige neue Methoden oder überschreiben virtuelle/abstrakte Methoden der Basisklasse um die Funktionsweise an den benötigten "Spezialfall" anzupassen.

Die OOP zwingt zu etwas abstrakterem Denken, sorgt dann aber für eine Strukturierung und Übersichtlickeit des QT die sich mit globalen Variablen einfach nicht erreichen läßt.

Nochmal: verboten sind globale Variablen nicht - manchmal sogar unumgänglich, aber wenn möglich sollte man imo darauf verzichten.


MfG,
Tryer


hassedelphi - Di 12.08.03 11:42

thx :wink: