Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Zugriff auf Variable aus anderer Unit
mick - Mo 19.10.09 17:49
Titel: Zugriff auf Variable aus anderer Unit
liebe forums-kollegen,
meine frage ist fuer einen "experten" sicherlich leicht zu klaeren, daher wollen wir mit der peinlichkeit beginnen. habe eine vereinfachte variante meines problems geschrieben, damit der programmcode drumherum hier nicht im weg steht.
zwei formulare in einem projekt. in unit1 wird nach button-klick eine zahl aus einem edit in die variable "zahl" ausgelesen. dann wird das formular von unit2 aufgerufen. soweit, so gut. danach soll in unit2 auf die variable "zahl" zugegriffen werden und ihr wert veraendert werden (s. u.). der zugriff klappt nicht. komme mit den uses- und public/private-angaben nicht zurecht (denke, hier liegt der hase begraben). wer vermag mir zu helfen?
erste unit:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| unit uUnit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, uUnit2;
type TForm1 = class(TForm) Edit1: TEdit; BtnZuweisenAufrufen: TButton; procedure BtnZuweisenAufrufenClick(Sender: TObject); private public Zahl: Integer; end;
var Form1: TForm1; implementation
{$R *.dfm}
procedure TForm1.BtnZuweisenAufrufenClick(Sender: TObject); begin Zahl := StrToInt(Edit1.Text); Form2.ShowModal; end;
end. |
zweite unit, im gleichen projhekt, versteht sich:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| unit uUnit2;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm2 = class(TForm) BtnNeueZuweisung: TButton; procedure BtnNeueZuweisungClick(Sender: TObject); private public end;
var Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.BtnNeueZuweisungClick(Sender: TObject); begin Zahl := 42; end;
end. |
danke fuer die hilfe im voraus,
ciao,
mick.
Andreas L. - Mo 19.10.09 17:55
In uUnit2 unter implementation:
Und der Zugriff geht dann so:
mick - Mo 19.10.09 19:15
danke fuer den hinweis.
doch dann bekomme ich folgende fehlermeldung:
[Fataler Fehler] uUnit1.pas(7): Überkreuzender Bezug zweier Units auf 'uUnit1'
ciao,
mick.
Xentar - Mo 19.10.09 19:56
Deswegen hat er ja geschrieben, unter Implementation.
Du hast es vermutlich bei den Interface Uses mit angehängt.
Edit: Unter Implementation gibts noch kein Uses, musst du selber erst noch einfügen.
mick - Mo 19.10.09 20:04
ah, alles klar, wer lesen kann ist klar im vorteil.
danke!
ps: welchen unterschied macht es, wenn ich das im implementation-teil selbst hinschreibe? kann mir jmd. einen text, eine anleitung, ein kl. skript o.ae. dazu (hier im forum?) empfehlen, wo ich da naeheres zu nachlesen kann? kann das naemlich jetzt so wie beschrieben machen, aber verstehe es nciht - warum darf das oben in uses nicht mit rein?
ciao,
mick.
NetSpider - Mo 19.10.09 20:11
Die Variable Zahl ist im public-Abschnitt einer Object-Definition deklariert. Somit wird jedes Objekt das vom Type TForm1 ist diese Variable als Attribute haben.
Also:
Wenn du die Variable global in der Unit habe moechtest, dann solltest du sie nach da verschieben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| ... type TForm1 = class(TForm) Edit1: TEdit; BtnZuweisenAufrufen: TButton; procedure BtnZuweisenAufrufenClick(Sender: TObject); private public end;
var Form1: TForm1; Zahl: Integer; implementation
... |
Allerdings ist dabei vorsicht geboten, da diese Variable von ueberall ausserhalb veraendert werden kann. Ausserdem hast du nur einmal Speicher reserviert (unabhaengig wie viele Objekte du von TForm1 erstellt hast). Soll heissen, diese Variable ist nicht Objekt-gebunden.
Zugriff erfolgt in uUnit2 mit:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| implementation
uses uUnit1;
...
procedure TForm2.BtnNeueZuweisungClick(Sender: TObject); begin uUnit2.Zahl := 42; end; |
Ich hoffe das stimmt so ungefaehr.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!