Autor |
Beitrag |
Travis
      
Beiträge: 48
|
Verfasst: Mi 25.09.02 18:41
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
      
Beiträge: 1333
Erhaltene Danke: 1
Arch Linux
Eclipse
|
Verfasst: 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.
_________________ Viele Grüße
Jakob
|
|
Travis 
      
Beiträge: 48
|
Verfasst: 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
      
Beiträge: 1333
Erhaltene Danke: 1
Arch Linux
Eclipse
|
Verfasst: Mi 25.09.02 21:43
kannst du etwas Code posten. Dann können wir dir auch helfen.  (vielleicht)
_________________ Viele Grüße
Jakob
|
|
Travis 
      
Beiträge: 48
|
Verfasst: 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 
      
Beiträge: 48
|
Verfasst: 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.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 48
|
Verfasst: 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
      
Beiträge: 109
|
Verfasst: 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 
      
Beiträge: 48
|
Verfasst: 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
      
Beiträge: 1333
Erhaltene Danke: 1
Arch Linux
Eclipse
|
Verfasst: 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.
_________________ Viele Grüße
Jakob
|
|
aogwaba
      
Beiträge: 109
|
Verfasst: Fr 27.09.02 22:00
Hi!
Dann zeig doch mal dein Beispiel.
cu
waba
[/quote]
|
|
aogwaba
      
Beiträge: 109
|
Verfasst: Fr 27.09.02 22:01
wow!
schon wieder gleiche Zeit.
|
|
DeCodeGuru
      
Beiträge: 1333
Erhaltene Danke: 1
Arch Linux
Eclipse
|
Verfasst: Fr 27.09.02 22:18
ist irgendwie auffällig oder? 
_________________ Viele Grüße
Jakob
|
|
Travis 
      
Beiträge: 48
|
Verfasst: 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:
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:
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
      
Beiträge: 1333
Erhaltene Danke: 1
Arch Linux
Eclipse
|
Verfasst: Fr 27.09.02 22:22
setz mal den Code von dem OnCreate-Ereignis in der zweiten Unit in das OnShow-Ereignis.
_________________ Viele Grüße
Jakob
|
|
Travis 
      
Beiträge: 48
|
Verfasst: 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
      
Beiträge: 1333
Erhaltene Danke: 1
Arch Linux
Eclipse
|
Verfasst: 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.
_________________ Viele Grüße
Jakob
|
|