Autor Beitrag
mick
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 159



BeitragVerfasst: Mo 19.10.09 16:49 
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:

ausblenden volle Höhe 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:

ausblenden volle Höhe 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.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: Mo 19.10.09 16:55 
In uUnit2 unter implementation:

ausblenden Delphi-Quelltext
1:
uses uUnit1;					


Und der Zugriff geht dann so:

ausblenden Delphi-Quelltext
1:
Form1.Zahl := 42;					
mick Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 159



BeitragVerfasst: Mo 19.10.09 18: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mo 19.10.09 18: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.

_________________
PROGRAMMER: A device for converting coffee into software.
mick Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 159



BeitragVerfasst: Mo 19.10.09 19: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 123

Windows XP Pro
Delphi 7 Enterprise
BeitragVerfasst: Mo 19.10.09 19: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:

ausblenden Delphi-Quelltext
1:
Form1.Zahl					


Wenn du die Variable global in der Unit habe moechtest, dann solltest du sie nach da verschieben:

ausblenden 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:

ausblenden 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.

_________________
Wer in die Fußstapfen anderer tritt hinterlässt keine eigenen Spuren!