Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Proceduren aus anderen units aufrufen


delphijanka - Do 24.07.08 18:55
Titel: Proceduren aus anderen units aufrufen
wie rufe ich eine Prozedur aus einem anderen Unit auf?

Danke.


Tilman - Do 24.07.08 19:00

1. Die prozedur muss im interface-Abschnitt ihrer unit deklariert sein - sonst geht es nicht.
2. Du musst die unit in deine uses-Klausel aufnehmen
3. Dann kannst du die Prozedur aufrufen.


delphijanka - Do 24.07.08 19:05

Genau Punkt (1) habe ich nicht, da ich nicht weiss wie es geht. Mit

interface
procedure xxx;

kommt ein Fehler.


Gausi - Do 24.07.08 19:14

user profile icondelphijanka hat folgendes geschrieben:
[...] kommt ein Fehler.
Dann machst du da was falsch.


delphijanka - Do 24.07.08 19:18

Wenn ich "procedure xxx;" direkt nach dem Wort "interface" schreibe, erscheint die Fehlermeldung "Deklaraton erwartet, aber USES gefunden".


Yogu - Do 24.07.08 19:22

Die Meldung kommt, weil du das Schlüsselwort uses nach einer Deklaration (eben deine Prozedur) in der Datei hast. Verschiebe also die gesamte uses-Klausel vor die Deklaration der Prozedur. Dann sollte das eigentlich klappen.


delphijanka - Do 24.07.08 19:24

Das ist wohl ein Witz. Meine Procedure steht irgendwo mittig im Quelltext, und uses SOLL zu Beginn stehen. Der Fehler liegt also woanders.


Tilman - Do 24.07.08 19:28

Poste mal deinen Code dann haben wir das ganz schnell gelöst.


Gausi - Do 24.07.08 19:35

Der Aufbau einer Unit ist grob so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
Unit <Name>;

interface

uses <Liste mit Units>;

<Deklarationen von Funktionen und Prozeduren>

implementation

uses <Liste mit Units>; // optional 

<Implementierung der oben deklarierten Funktionen und Prozeduren>


delphijanka - Do 24.07.08 19:36


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:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Grids, ExtCtrls, Unit2;

type
  TF = class(TForm)
  ...
  public
    procedure xxx;
  end;

var

  F: TF;

implementation

{$R *.DFM}

procedure xxx;
begin
end;

...

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:
unit Unit2;

interface

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

type
  TFNeu = class(TForm)
    ...
  end;

var

   FNeu: TFNeu;

implementation

{$R *.DFM}

procedure yyy;
begin
  Unit1.xxx;
end;

...


Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt


Gausi - Do 24.07.08 19:39

Äh, hast du lose Prozeduren, die du aufrufen willst, oder sind das Methoden einer Klasse? So, wie das Gerüst aussieht, solltest du dir nochmal ein paar Grundlagen zu Gemüte führen. ;-)


delphijanka - Do 24.07.08 19:41

ich verstehe deine ANtwort nicht. Was ist der Unterschied zwischen "losen" Proceduren und Methoden einer Klasse?

PS: Bei der Deklaration der "xxx"-Methode in der Unit1 habe ich auch "TF.xxx" ausprobiert - geht auch nicht.


Tilman - Do 24.07.08 19:48

Gausi meint dass man auch units anlegen kann die Sammlungen von Prozeduren und Funktionen darstellen. So hatte ich dich auch verstanden. Aber mir scheint jetzt du hast einfach nur zwei Formulare, und möchtest aus form2 auf Methoden von Form1 zugreifen. Das Problem: du darfst nicht unit1 in die interface-uses von form2 packen, wenn unit2 schon in der interface-uses von form1 steht. Lösung: schreibe sie in die implementation-uses (--> Gausis Quelltext).


Gausi - Do 24.07.08 19:50

Zuerstmal dürfte schon Unit1 nicht kompiliert werden, da die Methode xxx nicht implementiert wird


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
type 
  TF = class(TForm) 
  ... 
  public 
    procedure xxx; 
  end; 


var 
  F: TF; 

implementation 

{$R *.DFM} 

procedure TF.xxx; 
begin 
end;


In Unit 2 müsstest du dann per F.xxx auf die Prozedur zugreifen.

Eine "lose Prozedur" ist nicht Teil einer Klasse (in deinem Beispiel ist xxx eine Methode der Klasse TF), sondern steht einfach nur so da. Zum Beispiel sowas:


Delphi-Quelltext
1:
2:
3:
4:
function PlusEins(a: Integer): Integer; // kein "TF." oder so vor dem Namen der Funktion
begin
  result := a + 1;
end;


delphijanka - Do 24.07.08 19:55

wow, das hat geklappt, anstatt Unit1.xxx sollte ich einfach F.xxx schreiben.

Danke allen für die Aufmerksamkeit, danke Gausi.

Komisch sehe ich jedoch die Struktur bei Delphi. "Form" an sich ist ja nur die sichtbare Oberfläche - wie ich das verstehe, aber die Units selbst enthalten den Code und stellen somit die Klassen dar die ich gegenseitig nutzen kann. Ich sehe Javasprache weit im Vorteil, was diese Strukturierung angeht.


Gausi - Do 24.07.08 20:00

Man muss ja nicht alles in einer Form programmieren. Man kann auch Klassen bauen, die keine Form haben, aber mit jede Menge Funktionen und Prozeduren drin. Und man kann klassenlose Funktionen und Prozeduren in eine Unit packen.