![]() |
Korrekt Variablen definieren
Mal ein n00b Frage :oops:
Und zwar muß ich in meinem Prog viele Variablen in versch. proceduren und auch in andere Formulare (Units) übergeben. Nun funktioniert das auch, nur ab und an geht da wohl bei der Übergabe sporadisch etwas schief - ist aber nicht reproduzierbar :wall: Nun gibt es ja am Anfang immer folgene Grundstruktur:
Delphi-Quellcode:
Wo definiere ich nun welche Variable? Habe unitübergreifende Var in 'public' und dann verwendet
procedure ...
procedure ... private { Private-Deklarationen } Var1:string; //In Formular/Unit vorh. Var?! Var2, Var3 : integer; public { Public-Deklarationen } Var4 : string; //Globale in allen Units vorh. Var?! end; var Form2: TForm2; Var5 : BOOL; //für mich dasselbe wie 'private'... implementation uses Unit1, Unit2, Unit3; ... Wenn in einzelner unit verwendet dann in 'private' unter 'var' eigentlich nie groß was. Und wenn ich folgendes habe:
Delphi-Quellcode:
Das Prog schaltet bei button click einen timer einmal ein und beim nächsten click wieder aus.
procedure TForm1.Button1Click(Sender: TObject);
var EA : Bool; //wenn hier deklariert wird EA nie geändert, wenn dagegen EA:Bool in var an Formularanfang deklariert dann funktioniert's :gruebel: begin if EA=FALSE THEN begin Form4.logtab; //procedure welche eine neue tabelle erzeugt Form4.Timer1.enabled:=True; EA:=True; label1.caption:='Ein'; end else begin Form4.Timer1.enabled:=False; EA:=False; label1.caption:='Aus'; end; end; So, meine Frage: :wiejetzt: |
Re: Korrekt Variablen definieren
Setz mal alle die du Global haben willst zu der Deklaration
Code:
Dürfte eigentlich gehen
var
Form2: TForm2; Var5 : BOOL; //für mich dasselbe wie 'private'... implementation uses Unit1, Unit2, Unit3; Mfg |
Re: Korrekt Variablen definieren
Naja deine Ausführung welche Variable wo gilt war nicht ganz richtig.
Private : Nur in der Formularunit direkt ansprechbar Public : Überall ansprechbar, aber nur über TForm1.Variable Im Var-Teil nach Private/public und vor Implementation: Richtige Globale Variable. Überall direkt ansprechbar über Variablennamen In Funktion deklariert (wie dein EA): Nur in Funktion gültig und ansprechbar. Wird nach der Abhandlung der Funktion wieder 'gelöscht', ist also nicht mehr da. |
Re: Korrekt Variablen definieren
ok, das mit meinem EA wäre geklärt, weshalb er bei neuem Aufruf nicht mehr den Status weiß :roll:
Aber zu den globalen Var: Also wenn ich in den var teil vor implementation eine definiere ist diese überall ohne formularname davorgesetzt verfügbar und wenn in public muss der formularname mitgetippt werden. Bsp:
Delphi-Quellcode:
Und das ist der ganze Unterschied??
variable:='global' //in var vor implementation definiert
Form1.variable:='global' //in public definiert |
Re: Korrekt Variablen definieren
Der Unterschied ist, dass deine im Public-Teil deklarierte Variable zu deiner Klasse TForm1 gehört.
Das heisst zum Beispiel : Wenn in deiner Project-Unit (Project1 standardmässig) zum Beispiel zuerst form1 dann form 2 aufgerufen wird also so:
Code:
und im Create-event deiner Form1 auf eine Public deklarierte Variable zugegriffen wird (zB. ShowMessage(Form2.variable)), wird es unweigerlich zu einer Zugriffsverletzung kommen.
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2); Warum? eben weil Form2 noch nicht existiert und somit auch nicht die Public Variablen. Ist die Variable aber in deiner zweiten Unit Global deklariert und du machst Showmessage(variable), geht alles, weil globale Variablen zum Start des Programmes initialisiert werden. Will heissen : Sobald Formx := nil oder nicht existent ist, ist die public Variable auch nicht existent. Hoffe man verstehts ;) mfg smk |
Re: Korrekt Variablen definieren
desweiteren, wenn du 2 Instanzen von Tform1 erstellst, hat jede ihre eigene TForm1.variable, aber alle gemeinsam teilen sich eine globale variable. So als Merkregel für den Moment: verwende sowenig wie möglich globale Variable.
Grüsse Woki |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:52 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-2025 by Thomas Breitkreuz