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
delphijanka 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>; <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
Christian 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; 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!