Autor Beitrag
schitho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: Fr 06.02.04 22:50 
Hi,

hab wieder einmal eine typische Anfängerfrage :oops:

Ich habe 2 Formulare (Form1 und Form2) in 2 Units (Unit1 und Unit2).

In Unit1 hab ich eine Prozedur, die ich über die Schaltfläche Button1 starten kann. Dies funktioniert.

Von Form1 möchte ich über eine Schaltfläche Form2 aufrufen. Dies funktioniert auch.

Und nun kommts: Von der Form2 möchte ich über eine Schaltfläche die Prozedure der Unit1 aufrufen. Dies funktioniert nicht :cry:

Hier der Code der Unit1:

ausblenden volle Höhe Delphi-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:
40:
41:
42:
43:
44:
45:
46:
47:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation


{$R *.dfm}

uses unit2;

procedure test;
begin
  showMessage('Hallo');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  test
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Form2.show;
end;

end.


Hier der Code der Unit2:


ausblenden volle Höhe Delphi-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:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

uses unit1;

procedure TForm2.Button1Click(Sender: TObject);
begin
 form1.test;
end;

end.


Beim Versuch das Projekt zu Compilieren erhalte ich folgende Fehlermeldung:

Zitat:
[Fehler] Unit2.pas(30): Undefinierter Bezeichner: 'test'


Was mach ich falsch?

Danke!

Thomas

Moderiert von user profile iconPeter Lustig: Topic verschoben

_________________
(Sorry! Leider ewiger Delphi-Neuling)
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 06.02.04 23:19 
Hallo!

Du hättest auch die Suchfunktion nutzen können, Fragen diesen Typs gibt es sehr oft. Aber hier eine Antwort:

Du hast folgende Fehler gemacht:
(1) Die Prozedur "test" steht nicht im Interface-Teil der Unit1. Das muss sie, damit andere Units überhaupt "wissen", dass es sie gibt.

(2) Wenn Du (1) erledigen willst, musst Du das nicht machen, in dem Du test der Form1 zuordnest. Das heißt, die Funktion kann auch außerhalb von TForm1 deklariert werden und kann (muss) dann nicht mehr über "Form1.Test" sondern nur noch über "Test" aufgerufen werden.

MfG
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
schitho Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: Sa 07.02.04 00:48 
Hallo Peter,

die Suche hab ich eh genutzt, allerdings bin ich damit auch nicht wirklich weitergekommen.

Wenn ich im Inteface-Teil der Unit1 die Prozedur ergänze, dann erhalte ich folgende Fehlermeldung:

Zitat:
[Fehler] Unit1.pas(13): Ungenügende Forward- oder External-Deklaration: 'TForm1.test'


Im Interface-Teil hab ich die Prozedur nun so deklariert:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure test;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
:
:


Oder hab ich was falsch verstanden???

Gruß
Thomas

_________________
(Sorry! Leider ewiger Delphi-Neuling)
broesis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19



BeitragVerfasst: Sa 07.02.04 11:28 
Hallo!

Anstatt
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure test; 
begin 
  showMessage('Hallo'); 
end;

muss es
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure tform1.test; 
begin 
  showMessage('Hallo'); 
end;

heißen. Die Deklaration der Prozedur an sich is richtig.
Dann kannst du die Prozedur ganz einfach von Form2 mit form1.test; aufrufen.

Tschau
Broesis

_________________
"Wer andern eine Grube graebt ist Bauarbeiter"
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 07.02.04 12:48 
Allerdings sehe ich keinen Sinn darin, die Prozedur als Member von TForm1 zu deklarieren.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
schitho Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: Sa 07.02.04 23:26 
@ Broesis

Danke! Jetzt funktioniert es.

Gruß
Thomas

_________________
(Sorry! Leider ewiger Delphi-Neuling)
uruz
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 09.02.04 13:47 
alternativ koenntest du die funktion test auch global bekannt machen, wenn sie dir so wichtig ist... in diesem beispiel waer das wohl sogar eher sinnig, da diese "Hallo-Welt"-Anzeige ja nicht unbedingt zu Form1 gehoert....

daher koenntest du

ausblenden volle Höhe Delphi-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:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

procedure test;  {<span style="font-weight: bold">:arrow: globale Definition der Funktion test</span>}

var
  Form1: TForm1;

implementation


{$R *.dfm}

uses unit2;

procedure test;
begin
  showMessage('Hallo');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  test
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Form2.show;
end;

end.


davon wuerd ich aber allgemein abraten, wenn es sich um "Formularbezogene" Funktionen handelt... oder wenn "sensitive" Daten darin verarbeitet werden....

uruz [/b]