![]() |
Re: schon wieder ein Problem mit globale Variablen...
Zitat:
Delphi-Quellcode:
Unit2
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } Variable1a: String; public { Public-Deklarationen } Variable2a: String; end; var Form1: TForm1; Variable3a: String; implementation {$R *.dfm} uses Unit2; var Variable4a: String; procedure TForm1.FormCreate(Sender: TObject); var Variable5a: String; begin Variable1a := 'Hallo Welt 1 A!'; Variable2a := 'Hallo Welt 2 A!'; Variable3a := 'Hallo Welt 3 A!'; Variable4a := 'Hallo Welt 4 A!'; Variable5a := 'Hallo Welt 5 A!'; end; procedure TForm1.Button1Click(Sender: TObject); var Variable6a: String; begin Variable6a := 'Hallo Welt 6 A!'; //## Fremde Unit ## //ShowMessage(Variable1b); //klappt nicht - privat und andere Unit //ShowMessage(Variable2b); //klappt so nicht, trotz public ShowMessage(Form2.Variable2b); //klappt, aber nur mit Form2 davor ShowMessage(Variable3b); //klappt, wenn Unit eingetragen. Globale Variable //ShowMessage(Variable4b); //klappt nicht, global nur innerhalb der eigenen Unit //ShowMessage(Variable5b); //klappt nicht, lokale Variable //## Eigene Unit ## ShowMessage(Variable1a); //klappt, so aber nur in Form1-Prozeduren ShowMessage(Form1.Variable1a); //in normalen Prozeduren Form1 davor setzten ShowMessage(Variable2a); //klappt, so aber nur in Form1-Prozeduren ShowMessage(Form1.Variable2a); //in normalen Prozeduren Form1 davor setzten ShowMessage(Variable3a); //klappt überall in der eigenen Unit und in fremden Units ShowMessage(Variable4a); //klappt überall in der eigenen Unit //ShowMessage(Variable5a); //klappt nicht in fremder Prozedur, lokale Variable ShowMessage(Variable6a); //klappt, lokale Variable end; procedure Test; // normale Prozedur begin //## Fremde Unit ## //ShowMessage(Variable1b); //klappt nicht - privat und andere Unit //ShowMessage(Variable2b); //klappt so nicht, trotz public ShowMessage(Form2.Variable2b); //klappt, aber nur mit Form2 davor ShowMessage(Variable3b); //klappt, wenn Unit eingetragen. Globale Variable //ShowMessage(Variable4b); //klappt nicht, global nur innerhalb der eigenen Unit //ShowMessage(Variable5b); //klappt nicht, lokale Variable //## Eigene Unit ## //ShowMessage(Variable1a); //klappt nicht so... ShowMessage(Form1.Variable1a); //...in normalen Prozeduren Form1 davor setzten //ShowMessage(Variable2a); //klappt nicht so... ShowMessage(Form1.Variable2a); //in normalen Prozeduren Form1 davor setzten ShowMessage(Variable3a); //klappt überall in der eigenen Unit und in fremden Units ShowMessage(Variable4a); //klappt überall in der eigenen Unit //ShowMessage(Variable5a); //klappt nicht in fremder Prozedur, lokale Variable end; procedure TForm1.Button2Click(Sender: TObject); begin Test; end; end.
Delphi-Quellcode:
unit Unit2;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm2 = class(TForm) procedure FormCreate(Sender: TObject); private { Private-Deklarationen } Variable1b: String; public { Public-Deklarationen } Variable2b: String; end; var Form2: TForm2; Variable3b: String; implementation {$R *.dfm} var Variable4b: String; procedure TForm2.FormCreate(Sender: TObject); var Variable5b: String; begin Variable1b := 'Hallo Welt 1 B!'; Variable2b := 'Hallo Welt 2 B!'; Variable3b := 'Hallo Welt 3 B!'; Variable4b := 'Hallo Welt 4 B!'; end; end. |
Re: schon wieder ein Problem mit globale Variablen...
Zitat:
|
Re: schon wieder ein Problem mit globale Variablen...
Anstatt hier alle ins Blaue hinein raten, wartet doch einfach, bis der TE sich wieder meldet?! :gruebel:
|
Re: schon wieder ein Problem mit globale Variablen...
Zitat:
|
Re: schon wieder ein Problem mit globale Variablen...
Man braucht hier nicht über Wörter zu streiten global oder unit global - beide meinen das Selbe.
Selbstverständlich wird auch in Delphi auf globale Variablen zugegriffen. Wäre es ein Teufelswerk, wäre eine Implementierung solch einer Variable gar nicht erst möglich. Der Rat im eigenen Code keine globalen Variablen zu nutzen, sollte man trotzdem beherzigen. Umso umfangreicher der Code wird umso gefährlicher wird die Benutzung solcher globalen Variablen. |
Re: Variable aus anderer Unit kann nicht richtig ausgelesen
Ich habe oben noch mal etwas ergänzt, die Variable wird doch richtig ausgelesen, aber sie scheint einfach leer zu sein - obwohl sie vorher zugewiesen wurde.
@ Popov: Vielen Dank! Das solltest du vielleicht Mal allgemein irgendwo reinstellen, ist besser als die ganzen anderen Hilfe-Threads zu dem Thema. Ich probiere nochmal eben was aus... Ansonsten nehme ich mir mal ein paar von den Räten hier zu Herzen und verzichte auf "globale Variablen" - habe es halt so gelernt, stehe noch ziemlich am Anfang. |
Re: Variable aus anderer Unit kann nicht richtig ausgelesen
Wenn Du keine Dinge wie Referenzzählung brauchst, solltest Du wie bereits angesprochen lieber Properties verwenden. Das klingt kompliziert, ist aber im Grunde ganz einfach:
Delphi-Quellcode:
Nun hat jede Instanz, die Du von Deiner Klasse anlegst, eine eigene Property "Variable" und kommt sich garantiert nicht mit anderen Instanzen ins Gehege. Außerdem kannst Du Properties auch ReadOnly/WriteOnly definieren oder über die sog. Getter- und Settermethoden z.B. Fehleingaben abfangen.
type
TForm1 = class(TForm) ... private //eine private Variable vom gewünschten Datentyp definieren FVariable: Datentyp; ... public //und über eine Property indirekten Zugriff auf obige Variable gestatten property Variable: Datentyp read FVariable write FVariable; ... end; |
Re: Variable aus anderer Unit kann nicht richtig ausgelesen
Zitat:
|
Re: Variable aus anderer Unit kann nicht richtig ausgelesen
@ Popov - Ja, mein Lehrer hat das auch ganz selbstverständlich so erklärt...
@ DeddyH - Danke, ich probiers mal aus! |
Re: Variable aus anderer Unit kann nicht richtig ausgelesen
Habe jetzt 'property' benutzt, aber das Problem besteht weiterhin. Wenn ich in der 2. Unit versuche "Instanz" auszulesen, findet er sie zwar, zeigt aber an, dass sie leer ist.
Habe noch zwei Fragen (mit den Fragezeichen im Quelltext markiert): 1. Muss ich die Variable hier deklarieren - ansonsten zeigt Delphi an, es gäbe keine Variable 'WichtigerString'. 2. Greife ich so richtig auf 'Instanz' zu? 3. Wieso funktioniert das nicht :roll: *nein Scherzfrage...*
Delphi-Quellcode:
unit ErsteUnit
type TForm1 = class(TForm) ... private WichtigerString: String; public property Instanz: string read WichtigerString write WichtigerString; end; var Form1: TForm1; WichtigerString: string; // ????????? 1. implementation ... begin WichtigerString:= 'A1CW5d3f'; end.
Delphi-Quellcode:
unit ZweiteUnit;
... type TForm2 = class(TForm) ... var Form2: TForm2; implementation uses ErsteUnit; ... begin showmessage(form1.instanz); //???????? 2. end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:51 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