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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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:


Delphi-Quelltext
1:
uses uUnit1;                    


Und der Zugriff geht dann so:


Delphi-Quelltext
1:
Form1.Zahl := 42;                    


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:


Delphi-Quelltext
1:
Form1.Zahl                    


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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    //Zahl: Integer;
  end;

var
  Form1: TForm1;
  Zahl: Integer;  // hier her
  
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.