Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Variablen in mehreren Formularen nutzen
Travis - Mi 25.09.02 18:41
Titel: Variablen in mehreren Formularen nutzen
Hallo Leute,
ich bin absoluter Delphianfänger und habe folgendes Problem: Ich habe ein Hauptformular (frmMain oder Form1) und ein weiteres unter dem Namen frmItemAdd. Wie kann ich es anstellen, dass ich auf Variablen, welche ich in Form1 deklariert habe, in dem anderen Formular zugreifen kann? Wenn ich das versuche, kommt immer die Meldung "Undefinierter Bezeichner: 'Variable'". Ich benutze z. Z. Delphi 5.
Schon im Voraus danke!!
Travis
DeCodeGuru - Mi 25.09.02 19:49
also die Variable, die du in der anderen Unit/Form verwenden willst musst du global in dem Public-Bereich deklarieren. So zum Beispiel:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| type TForm1 = class(TForm) private { Private-Deklarationen } public MyVar: String; { Public-Deklarationen } end; |
So, in der anderen Unit/Form musst du erst die Unit bzw. Form angeben und dann die Variable "aufrufen und das kannste so machen.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| implementation
uses Unit1; //WICHTIG: Hier musst du die Unit1 einbinden. Unit1 ist die Unit von Form1
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject); begin Form1.MyVar := 'Hallo'; end; |
Ich hoffe, ich konnte dir etwas helfen.
Travis - Mi 25.09.02 21:22
Vielen Dank für deine Antwort!
Im Grunde genommen funktioniert es jetzt sogar, bis darauf, dass die Variable beim Auslesen aus einem anderen Formular immer leer ist. Aber Fehler vom Compiler kommen jetzt zum Glück nicht mehr.
Falls jemand noch eine Antwort weiß, kann er natürlich gerne Posten...
MfG
Travis
DeCodeGuru - Mi 25.09.02 21:43
kannst du etwas Code posten. Dann können wir dir auch helfen. :wink: (vielleicht)
Travis - Mi 25.09.02 21:56
Also: Ich habe zwei Formulare, auf die es eigentlich ankommt: Das Hauptformular heißt 'frmMain', das Andere 'frmItemAdd'. Ich habe momentan die Variable wie folgt im Code von 'frmItemAdd' deklariert:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| public bookfile: string; { Public-Deklarationen } end;
implementation
uses uDrive;
{$R *.DFM} |
Aus der frmMain fülle ich dann die Variable wie folgt:
Quelltext
1: 2: 3: 4: 5: 6:
| if cbFahrzeug.Text = aktdatensatz.display then begin frmItemAdd.bookfile := aktdatensatz.trvfile; //<-- wird gefüllt btnRemCar.Enabled := True; btnPrint.Enabled := True; end; |
Das komische ist ja, wenn ich die Variable im frmMain deklariere und auch dort wieder auslese, ist sie gefüllt. Wenn ich dann jedoch das zweite Formular öffne, ist sie dort leer.
Na ja, ich weiß nicht mehr weiter.
Danke für die Hilfe,
Travis
Travis - Fr 27.09.02 17:56
Es scheint wohl doch ein größeres Problem zu sein, denn weder AUQ.de-User, noch mein Informatik-Lehrer in der Schule konnte mir bis jetzt helfen. Aber na ja, ich bin guter Dinge, dass irgendwann jemand die Antwort weiß.
Trotzdem nochmals Danke für die Hilfe,
Travis
PS: Habe gesehen, dass Ulrike aus der Rubrik 'Objekt Pascal' das selbe Problem zu haben scheint.
Delete - Fr 27.09.02 18:19
Hast du eine lokale Variable mit gleichen Namen in der Unit?
Oder schreib mal den Namen des Formulars vor die Variable in der anderen Unit.
Travis - Fr 27.09.02 19:33
Beides funktioniert nicht. Was die Variablen angeht habe ich weder eine lokale, noch eine andere globale mit dem gleichen Namen. Daran kann es also schon mal nicht liegen.
Den Namen des Formulars hab ich ja sowieso in der anderen Unit (dort, wo die Variable nicht deklariert wurde) davorstehen.
Kann es aber vielleicht sein, dass ich die Prozedur, welche die Variable in der anderen Unit füllt, auch als public deklarieren muss? Das war jetzt gerade ein spontaner gedanke. Ich weiß weder wie das geht, noch ob das möglich ist.
Travis
aogwaba - Fr 27.09.02 21:02
Hi!
Zitat: |
Kann es aber vielleicht sein, dass ich die Prozedur, welche die Variable in der anderen Unit füllt, auch als public deklarieren muss? Das war jetzt gerade ein spontaner gedanke. Ich weiß weder wie das geht, noch ob das möglich ist. |
Nein, es reicht wenn die Variable public ist.
Ansonsten musst du es machen wie DeCodeGuru gesagt hat, dann klappt das auch, oder du hast einen anderen Fehler eingebaut.
cu
waba
Travis - Fr 27.09.02 21:35
Zitat: |
Ansonsten musst du es machen wie DeCodeGuru gesagt hat, dann klappt das auch, oder du hast einen anderen Fehler eingebaut.
|
Genau das ist es ja: Ich habe es so gemacht wie 'DerCodeGuru' gesagt hat, und trotzdem funktioniert es nicht.
Selbst wenn ich nur ein ganz einfaches Beispiel konstruiere, mit zwei Units und zwei Formularen funktioniert das ganze nicht. Außerdem hat ja 'Ulrike' aus dem "Objekt Pascal"-Board genau die gleichen Probleme, nur das sie keine Strings, sondern Integer weiterreichen will.
MfG
Travis
DeCodeGuru - Fr 27.09.02 22:00
setzt einfach mal en par ShowMessage damit du den fehler eingrenzen kannst. Besonders wichtig: Ein ShowMessage nach dem Füllen der Variable, damit du auch ganz sicher weiss, dass sie gefüllt wurde.
aogwaba - Fr 27.09.02 22:00
Hi!
Dann zeig doch mal dein Beispiel.
cu
waba
[/quote]
aogwaba - Fr 27.09.02 22:01
wow!
schon wieder gleiche Zeit.
DeCodeGuru - Fr 27.09.02 22:18
ist irgendwie auffällig oder? :mrgreen:
Travis - Fr 27.09.02 22:20
Ich bin jetzt nach langem Probieren endlich einen Schritt weiter gekommen: Die Variable ist gefüllt, aber nicht, wenn ein OnCreate-Ereignis aufgerufen wird!
Hier der gewünschte Quellcode:
Hier von Unit1:
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: 35: 36: 37:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public pubvar: string; { Public-Deklarationen } end;
var Form1: TForm1;
implementation
uses Unit2;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject); begin pubvar := Edit1.Text; // Variable wird gefüllt! ShowMessage(pubvar); //Variable ist gefüllt! Form2.ShowModal; end;
end. |
Und hier von Unit2:
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: 35: 36: 37: 38: 39:
| unit Unit2;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm2 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end;
var Form2: TForm2;
implementation
uses Unit1;
{$R *.DFM}
procedure TForm2.Button1Click(Sender: TObject); begin ShowMessage(Form1.pubvar); //Variable ist gefüllt!!! end;
procedure TForm2.FormCreate(Sender: TObject); begin Button1.Caption := (Form1.pubvar); //Variable ist leer! end;
end. |
Travis
DeCodeGuru - Fr 27.09.02 22:22
setz mal den Code von dem OnCreate-Ereignis in der zweiten Unit in das OnShow-Ereignis.
Travis - Fr 27.09.02 22:32
Das ist des Rätsels Lösung! Und selbst die Informatik-Lehrer in der Schule hatten nicht durchgeblickt *g*.
Na ja, hauptsache es funktioniert!
Nochmals vielen Danke!!!
Travis
DeCodeGuru - Sa 28.09.02 09:31
des liegt wahrscheinlich daran, dass die Form2 vor dem Füllen der variable created wird -> der Zugriff findet auf die leere Variable statt.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!