Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi probleme beim prozeduraufrufen (https://www.delphipraxis.net/79092-probleme-beim-prozeduraufrufen.html)

mastaofdesasta 16. Okt 2006 10:41


probleme beim prozeduraufrufen
 
Hi,

ist leider eine Anfängerfrage, aber ich hab nix dazu gefunden:
Ich hab drei Forms, die erste wird automatisch erzeugt, die Zweite wird beim Create der Ersten erzeugt und die Dritte bei einem Klick auf einen Button der Zweiten. Das funktioniert ja soweit ;-) Jetzt möchte ich aber wenn ich auf einen Button in der dritten Form klick, dass eine public-prozedur in der zweiten Form aufgerufen wird und sich irgendein Element der zweiten Form ändert (zB: die Caption des Buttons).
Die Prozedur kann ich aufrufen, aber sobald ich auf ein Element zugreifen möchte, bekomm ich eine EAccessViolation. Meine Frage ist wie kann ich das umgehen und vor allem: Wieso bekomm ich das nicht wenn ich nur zwei Forms erstelle (dh: die erste in obigen Beispiel weglasse)?

Danke schon mal.

messie 16. Okt 2006 10:53

Re: probleme beim prozeduraufrufen
 
Bei mir macht Dein Beispiel keine Zugriffsverletzungen. Wen hast Du denn als Owner in der create-Routine gesetzt?

Grüße, Messie

3_of_8 16. Okt 2006 10:55

Re: probleme beim prozeduraufrufen
 
Bist du dir sicher, dass das Formular und die komponenten, auf die du zugreifst, schon instantiiert sind?

mastaofdesasta 16. Okt 2006 11:24

Re: probleme beim prozeduraufrufen
 
Für den Owner hab ich nil und Self probiert: Dasselbe Problem. Ich poste mal den Code:

unit Unit1;

uses Unit2;

procedure TForm1.FormCreate(Sender: TObject);
var Form: TForm;
begin

Form:=TForm2.Create(nil);
Form.Show;

end;

unit Unit2;

uses Unit3;

procedure TForm2.Button1Click(Sender: TObject);
var Form: TForm;
begin
Form:=TForm3.Create(nil);
Form.Show;

end;

procedure TForm2.Test;
begin
Button1.Caption:='**';
end;

unit Unit3;

uses Unit2;

procedure TForm2.Button1Click(Sender: TObject);
begin
Unit2.Form1.Test;

end;

Wie gesagt die Methode Test ist public.

Instantiiert ist da alles richtig oder?

hoika 16. Okt 2006 11:29

Re: probleme beim prozeduraufrufen
 
Hallo,

schon, sonst würde es ja nicht laifen ;)
aber...

Unit2.Form1 ist NIL !

Du hast ja in deinen Methoden eine var TForm-Variable.

Du musst schon schreiben

Unit2.Form1:= TForm.Create(NIL)

Dann kannst du auch gleich die Variablen mal besser bezeichnen,
also Unit2.Form_WatWeesIch


Wobei das alles schlechter Programmierstil ist,
falls das "Test" nicht irgendwas im Form2 macht.


Heiko

messie 16. Okt 2006 11:37

Re: probleme beim prozeduraufrufen
 
...zusätzlich ist Deine Variable Form lokal in einer Ereignisroutine deklariert. Damit kannst Du nach dem FormShow meiner Meinung nach nicht mehr darauf zugreifen.

Grüße, Messie

uwewo 16. Okt 2006 12:03

Re: probleme beim prozeduraufrufen
 
Hi,

versuche es mal so

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var Form: TForm;
begin
   if Form = nil then Form := TForm.Create(Application);
   Form.Show;
end;

Muetze1 16. Okt 2006 12:07

Re: probleme beim prozeduraufrufen
 
Zitat:

Zitat von uwewo
Hi,

versuche es mal so

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var Form: TForm;
begin
   if Form = nil then Form := TForm.Create(Application);
   Form.Show;
end;

Dies ist nicht nutzbar. Einfacher Grund: Die lokale Variable Form wird nicht initialisiert und enthält damit immer einen Zufallswert und kann damit mit einer sehr hohen Wahrscheinlichkeit ungleich Nil sein. Daher würde er ohne Erstellung der Form im Datennirvana eine Methode Show aufrufen -> es kracht im besten Falle. Auch wäre die Abfrage in diesem Falle hinfällig, da lokale Variablen bei verlassen der Methode/Procedure ihre Gültigkeit verlieren und damit ihren Inhalt. Wenn du die Methode/Procedure erneut aufrufst, steht nicht mehr das damalige drinne sondern ein zufälliger Inhalt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:02 Uhr.

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