Neue Antwort schreiben 
 
Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
[Pascal] auf Variable aus übergeordneter Unit zugreifen
thosch97 Offline
All things have a right to grow

Beiträge: 9.843
Registriert seit: Feb 2010
Beitrag #1
[Pascal] auf Variable aus übergeordneter Unit zugreifen
Moin,

ich habe hier ein Lazarus-Projekt (Ruhe, es handelt sich um den Informatikunterricht, mir wär auch was anderes lieber), in dem ich zwei Formulare brauche. Dafür braucht man offenbar auch zwei Units. Jetzt muss ich aber aus der untergeordneten Unit auf eine Variable der oberen Unit zugreifen. Geht das?
Code:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  unit2;

type

  { TCourt }

  TCourt = class(TForm)
    Ball: TShape;
    Racket: TShape;
    Timer: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure TimerTimer(Sender: TObject);
  private
    { private declarations }
    dx, dy: Integer;
    isRunning: boolean;
  public
    { public declarations }
  end;

var
  Court: TCourt;

implementation

{$R *.lfm}

{ TCourt }

procedure TCourt.TimerTimer(Sender: TObject);
begin
  if isRunning then begin
   Ball.top:=Ball.top+dy;
   Ball.left:=Ball.left+dx;
   if (Ball.top+Ball.Height>=clientheight) or (Ball.top<=0) then dy:=-dy;
   if (Ball.width+Ball.left>=clientwidth) then dx:=-dx;
   if (Ball.Top>=Racket.Top) and not (Ball.Top>Racket.Top+Racket.Height) and
      (Ball.Left<=Racket.Left+Racket.Width) then begin
        dx:=-dx;
        ControlWindow.pPoints.Caption:=
         inttostr(strtoint(ControlWindow.pPoints.Caption)+1);
   end;
   if (Ball.Left<0) then begin
      ControlWindow.pFails.Caption:=
       inttostr(strtoint(ControlWindow.pFails.Caption)+1);
      isRunning:=false;
   end;

  end;

end;

procedure TCourt.FormCreate(Sender: TObject);
begin
  dx:=10;
  dy:=10;
end;

procedure TCourt.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
   Racket.Top:=Y;
end;

end.
Code:
unit Unit2;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls;

type

  { TControlWindow }

  TControlWindow = class(TForm)
    btStart: TButton;
    lPoints: TLabel;
    lFails: TLabel;
    pPoints: TPanel;
    pFails: TPanel;
    procedure btStartClick(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  ControlWindow: TControlWindow;

implementation

{$R *.lfm}

{ TControlWindow }

procedure TControlWindow.btStartClick(Sender: TObject);
begin
  Court.isRunning:=true;
end;

end.

73
thosch97

PGP-Key E384 009D 3B54 DCD3 21BF 9532 95EE 94A4 3258 3DB1 | S/MIME-Key 0x1A33706DAD44DA
G d-@ s+:- a--- C+++ UB+L++ P--- L++@ E-@>++ W+ N o? K? w>++ !O !M !V PS+++ PE-- Y+>++ PGP++>+++ !t 5? X? !R tv b+++>++++ DI !D G>+ e>+++ h !r>++ !z
„Die Aachener gelten als Erfinder des 4. Hauptsatzes der Thermodynamik: ‚Thermo schreibt man zweimal.“‘
“Saying that Java is good because it works on all platforms is like saying oral sex is good because it works on all sexes.”
„Es gibt 10 Sorten von Leuten: Die einen verstehen das Binärsystem, die anderen nicht.“
„Manche Männer lieben Männer, Manche Frauen eben Frauen; Da gibt's nix zu bedauern und nichts zu staunen; Das ist genau so normal wie Kaugummi kauen; Doch die meisten werden sich das niemals trauen“
(Dieser Beitrag wurde zuletzt bearbeitet: 15.10.2013 09:26 von thosch97.)
15.10.2013 09:24
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Mr. Vain Offline
Jetzt auch mit TCP/IP-Netzwerk

Beiträge: 1.192
Registriert seit: Nov 2008
Beitrag #2
RE: [Pascal] auf Variable aus übergeordneter Unit zugreifen
Aus meiner Turbo Pascal Erfahrung heraus wuerd ich sagen, dass geht NICHT. Auf Variablen uebergeordneter Units kann man nicht zugreifen, weil sich die Referenz auf die Units dann quasi "ueberkreuzen" wuerden. (Cross Link Error... hiess das irgendwie). Ob das nun bei Lazarus immer noch so ist, weiss ich jetzt nicht, da ich nicht so der Delphi Fan bin.

Klassiker:
Am5x86 (Asus VL/I 486SV2GX4) | Am5x86 (ECS UM8810P-AIO) | Pentium III-S 1400MHz (Gigabyte 6VTXE)
Gaming-Rig: Core i7 7700k (Gigabyte Z270X Gaming 5)
HTPC: Core i3 4160 (ASRock H97 Pro4)
15.10.2013 19:29
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Magic94 Offline
mehr Kerne ist immer besser

Beiträge: 1.385
Registriert seit: Nov 2010
Beitrag #3
RE: [Pascal] auf Variable aus übergeordneter Unit zugreifen
Lehrer hätten es gerne mit "gettern und Settern" ... Ich eher stehe auf die Kreuzbezüge

Kreuzbezüge:

du setzt in Unit1 die Variable, welche du in Unit2 braucht in den "public" Teil.
Und bei Unit2 schreibst du (Code aus einem meiner Delphi-Projekte):
Zitat:var
Form1: TForm1;

implementation

uses
Unit1;


{$R *.dfm}

Wenn du es schöner machen willst ohne Kreuzbezüge:

in Unit1 im Public Teil 2 Funktionen erzeugen:
Zitat:private
{ private declarations }
dx, dy: Integer;
isRunning: boolean;
public
function GetDX : integer;
procedure SetDX(temp:integer);
{ public declarations }
end;

Diese sehen vom Code folgendermaßen aus:

Zitat:function GetDX : integer;
begin
Result := dx; //Das Ergebnis dieser Funktion, welche du in Unit2 aufrufst, gibt den Wert der Variable dx aus Unit 1 zurück
end;

Zitat:procedure SetDX(temp:integer);
begin
dx := temp; //Du rufst von Unit2 aus SetDX(3) auf und somit fügt diese Prozedur dann die Variable nach Unit1 über.
end;

Im Endeffekt hast du nach kurzer Zeit aber schon keinen Bock mehr für jede Variable den ganzen Kram zu schreiben.


aber viel Spaß.

PS: Falls das jetzt nicht per STRG+C funktioniert, ich hab das grade so aus dem Kopf runtergeschrieben.

HP DL-580 G7
2x Intel Xeon E7-2870 (10 x 2,4GHz)
96GB DDR3-1333 RAM
NVIDIA GeForce GTX 1080 MSI (Blower)
Samsung 850 Pro 512GB auf PCIe Karte
4TB Seagate billigfieh
72GB 10K HP Drive
(Dieser Beitrag wurde zuletzt bearbeitet: 15.10.2013 19:42 von Magic94.)
15.10.2013 19:36
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Neue Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste