Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Globale Variable in anderen Forms = 0 obwohl schon definiert (https://www.delphipraxis.net/196700-globale-variable-anderen-forms-%3D-0-obwohl-schon-definiert.html)

DelphiforIngBachelor 10. Jun 2018 18:27


Globale Variable in anderen Forms = 0 obwohl schon definiert
 
Hallo Leute,

Ich habe folgendes allgemeines Problem

BSP:
In Form 6 wird die Variable "ZimmerG" mit 6 definiert

In Form 8 soll die Variable angezeigt werden. Anstatt 6 wird jedoch 0 angezeigt.


Weiß jemand wie ich das Problem in den Griff bekomme?


Mit freundlichen Grüßen

Jan

Hier die relevanten Ausschnitte des Quellcodes der Unit6:

Delphi-Quellcode:
unit Unit6;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Math, StdCtrls;

type
  TForm6 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Edit4: TEdit;
    Label8: TLabel;
    Label9: TLabel;
    Edit5: TEdit;
    Label10: TLabel;
    Edit6: TEdit;
    Label11: TLabel;
    Edit7: TEdit;
    Button1: TButton;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    Label17: TLabel;
    Button2: TButton;
    Label3: TLabel;
    Edit8: TEdit;
    Edit9: TEdit;
    Edit10: TEdit;
    Edit11: TEdit;
    Label18: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public


  function Zimmer(a, b, c, d, e, f: Real):Real;

  function BerechneAbluft(Baeder, Kuechen, Toiletten, HWR: Real): Real;

  function BerechneZuluft(Nutzer: Real):Real;

  function Innenliegend(Baeder, Kuechen, Toiletten, HWR: Real): Real;
    { Public-Deklarationen }
  end;


var


  Form6: TForm6;
  Baeder, Kuechen, Toiletten, HWR, Schlafzimmer, Wohnzimmer, Nutzer, ZimmerG, Innen, a, b, c, d, e, f: Real;



implementation

uses Unit7;

function TForm6.Innenliegend(Baeder, Kuechen, Toiletten, HWR: Real): Real;
begin
Innenliegend := Baeder+Kuechen+Toiletten+HWR
end;


 function TForm6.BerechneAbluft(Baeder, Kuechen, Toiletten, HWR: Real): Real;

 begin
 BerechneAbluft := (Baeder+Kuechen)*60+(Toiletten+HWR)*30;
 end;

 function TForm6.Zimmer(a, b, c, d, e, f: Real): Real;
 begin
Zimmer := a+b+c+d+e+f;
 end;

 function TForm6.BerechneZuluft(Nutzer: Real):Real;

 begin
 BerechneZuluft := (Nutzer*30);
 end;
{$R *.dfm}


procedure TForm6.Button1Click(Sender: TObject);

begin
a := StrToFloat(Edit8.Text);
b := StrToFloat(Edit9.Text);
c := StrToFloat(Edit10.Text);
d := StrToFloat(Edit11.Text);
e := StrToFloat(Edit7.Text);
f := StrToFloat(Edit6.Text);
ZimmerG := (Zimmer(a, b, c, d, e, f));
Innen := (Innenliegend(Baeder, Kuechen, Toiletten, HWR));

Nutzer := StrToFloat(Edit5.Text);
Baeder := StrToFloat(Edit1.Text);
Kuechen := StrToFloat(Edit2.Text);
Toiletten := StrToFloat(Edit3.Text);
HWR := StrToFloat(Edit4.Text);
Label16.Caption := FloatToStr(BerechneZuluft(Nutzer));
Label13.Caption := FloatToStr(BerechneAbluft(Baeder, Kuechen, Toiletten, HWR));
Label18.Caption := FloatToStr(ZimmerG);


if

Label16.Caption = '0'

then

showmessage ('Bitte prüfen Sie Ihre Angaben');

end;


procedure TForm6.Button2Click(Sender: TObject);
begin
Form7.Show;
end;

end.

[B]und der Unit 8[/B]

unit Unit8;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Unit6;

type
  TForm8 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label14: TLabel;
    Button1: TButton;
    Label13: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    Label17: TLabel;
    Label18: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form8: TForm8;

  Bewertung, Infiltration, Feuchteschutz, Innen, ZimmerG, Nutzer: Real;

implementation

{$R *.dfm}

procedure TForm8.Button1Click(Sender: TObject);
begin
Label17.Caption := FloatToStr(ZimmerG);
Label16.Caption := FloatToStr(Nutzer);
Label18.Caption := FloatToStr(Bewertung);

if
Feuchteschutz < Infiltration
then
Label13.Caption := 'Ja'
else
Label13.Caption := 'Nein';

if
Innen > 0
then
Label15.Caption := 'Ja'
else
Label15.Caption := 'Nein'


end;


end.

KodeZwerg 10. Jun 2018 19:09

AW: Globale Variable in anderen Forms = 0 obwohl schon definiert
 
Bearbeite bitte Deinen Text und setze Deinen Code innerhalb [ DELPHI] Dein Code [ /DELPHI] (ohne die leerzeichen in den eckigen Klammern) damit es lesbarer wird, Danke.
Ps: Wenn es mehrere Dateien sind, benutze mehrere [ DELPHI] Blöcke, Danke.

mkinzler 10. Jun 2018 19:15

AW: Globale Variable in anderen Forms = 0 obwohl schon definiert
 
Du hast in beiden Units jeweils eine lokale Variable mit dem selben Namen.

DeddyH 10. Jun 2018 19:25

AW: Globale Variable in anderen Forms = 0 obwohl schon definiert
 
Du meinst globale Variable ;)

Alallart 10. Jun 2018 20:02

AW: Globale Variable in anderen Forms = 0 obwohl schon definiert
 
Ich reduziere deinen Code auf das Wesentliche:
Delphi-Quellcode:
unit Unit6;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Math, StdCtrls;

var
  ..., ZimmerG, ...: Real;
Delphi-Quellcode:
unit Unit8;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Unit6;

var
  ..., ZimmerG, ...: Real;
So wie es aussieht hast du in Unit6 und Unit8 beide Male ZimmerG als globale Variable daklariert. Wenn du also in Unit6 der Variable einen Wert zuweist, und du eine gleichnamige Variable in Unit8 hast, greifen Funktionen in Unit8 auch auf die Variable in Unit8. Nicht auf die in Unit6.

KodeZwerg 10. Jun 2018 20:10

AW: Globale Variable in anderen Forms = 0 obwohl schon definiert
 
Wenn er den Namespace voranstellt klappt das schon, aber ob das dann Sinn und Zweck erfüllt steht in einem anderen Kapitel.

jaenicke 10. Jun 2018 21:51

AW: Globale Variable in anderen Forms = 0 obwohl schon definiert
 
Ein Paradebeispiel warum globale Variablen keine gute Idee sind.
Wäre das eine Eigenschaft des Formulars, wäre diese eindeutig mit Form8.ZimmerG angesprochen worden.

Der Übersicht halber würde es auch Sinn machen statt der Standardnamen wie Form8 besser der Funktion entsprechende eigebe Namen zu benutzen.

hoika 11. Jun 2018 03:18

AW: Globale Variable in anderen Forms = 0 obwohl schon definiert
 
Hallo,
so schlimm sing globale Variablen nicht.

Aber ich würde alla globalen Varablen zumindestens in ein separate Unit auslagern.

jaenicke 11. Jun 2018 03:59

AW: Globale Variable in anderen Forms = 0 obwohl schon definiert
 
Zitat:

Zitat von hoika (Beitrag 1404494)
so schlimm sing globale Variablen nicht.

Dazu kommt, dass du schlecht siehst wer diese wann initialisiert und hineinschreibt. Deshalb gibt das nur unnötige Folgefehler, wenn man sie ohne Not verwendet (wie es meistens der Fall ist). Wartbar ist etwas anderes...

himitsu 11. Jun 2018 09:50

AW: Globale Variable in anderen Forms = 0 obwohl schon definiert
 
Und niemals extern auf die Variablen direkt zugreifen, möglichst immer über Property/Methoden.
Wenn es erstmal nur ein einfaches preperty ist, was direkt auf die Variablen geht, so kann man später immernoch Getter und Setter einfügen.
Gut, um Schreibzugriffe zu prüfen und auch zum Debuggen ganz praktisch, um da Haltepunkte reinzumachen und und und


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:32 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf