![]() |
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. |
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. |
AW: Globale Variable in anderen Forms = 0 obwohl schon definiert
Du hast in beiden Units jeweils eine lokale Variable mit dem selben Namen.
|
AW: Globale Variable in anderen Forms = 0 obwohl schon definiert
Du meinst globale Variable ;)
|
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:
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.
unit Unit8;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Unit6; var ..., ZimmerG, ...: Real; |
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.
|
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. |
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. |
AW: Globale Variable in anderen Forms = 0 obwohl schon definiert
Zitat:
|
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 |
AW: Globale Variable in anderen Forms = 0 obwohl schon definiert
Zitat:
Delphi-Quellcode:
und
goto
Delphi-Quellcode:
. ;-)
with ... do
...:cat:... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz