Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - procedure auf einer anderen unit benutzen???


GigaNeko - Sa 03.02.07 19:40
Titel: procedure auf einer anderen unit benutzen???
hi, ich hab ein programm geschrieben in dem ich 2 units benutze. in der ersten unit befindet sich eine selbstgeschriebene prozedure. nun möchte ich es aber so haben, dass sobald eine procedur in den unit 2 abgelaufen ist die selbstgeschriebene procedure aus unit 1 gestartet wir. wie mache ich das?


Moderiert von user profile iconChristian S.: Topic aus Sonstiges (Delphi) verschoben am So 04.02.2007 um 11:31


Delete - Sa 03.02.07 19:48

einfach, in dem du in unit drei folgenden code einfügst und diesen code aufrufst:


Delphi-Quelltext
1:
2:
3:
4:
5:
procedure starte_funktion_aus_unit2_dann_aus_unit1;
begin
 unit2.deinefunktion;
 unit1.deinefunktion;
end;


Fabian E. - Sa 03.02.07 20:01

oder
 uses ....,unit1,... bei unit 2

Delphi-Quelltext
1:
2:
3:
4:
 TForm2.procedurxyz();
begin
procedure_aus_unit1;
end;


GigaNeko - So 04.02.07 12:25

unter implementation bei uses steht aber schon bei unit1, dass unit2 verwendet wird und andersherum auch.

da steht immer:

[Fehler] UNT_pingu.pas(120): Undefinierter Bezeichner: 'dateisichern_l'
UNT_pingu ist unit2 und dateisichern_l ist meine procedure in unit1 (UNT_main)


IngoD7 - So 04.02.07 12:32

So, wie deine Fragestellung zu verstehen ist, hast du alle möglichen Antworten bekommen. Wenn deine Uses-Anweisungen breits ausreichend sind, na, umso schöner.

Wenn jetzt irgendwas nicht funktioniert oder du irgendetwas nicht verstanden haben solltest, müsstest du mal gezielt nachfragen. Am besten mit Beispielcode.


Jakob Schöttl - So 04.02.07 12:33

und das wichtigste, was ich ewig lang nicht gewusst habe ist, dass deine procedure im interface-Abschnitt deklariert ist!
So ungefähr:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
unit unit1;

interface

procedure MyProc;

implementation

procedure MyProc;
begin
  ShowMessage('Ausgeführt');
end;

end.


GigaNeko - So 04.02.07 12:40


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

interface

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

type
  TFRM_main = class(TForm)
    LBL_tempo: TLabel;
    COB_tempo: TComboBox;
    BTN_start: TBitBtn;
    LBL_treffer: TLabel;
    LBL_drehungen: TLabel;
    LBL_fehler: TLabel;
    LBL_c: TLabel;
    LBL_highscore: TLabel;
    SGR_highscore: TStringGrid;
    procedure BTN_startClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure COB_tempoChange(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  FRM_main: TFRM_main;

implementation

uses UNT_pingu;


{$R *.dfm}



und hir unit2

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

interface

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

type
  TFRM_pingu = class(TForm)
    IMG_8: TImage;
    IMG_7: TImage;
    IMG_6: TImage;
    IMG_5: TImage;
    IMG_4: TImage;
    IMG_3: TImage;
    IMG_2: TImage;
    IMG_1: TImage;
    TMR_timer: TTimer;
    procedure TMR_timerTimer(Sender: TObject);
    procedure IMG_1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
  FRM_pingu: TFRM_pingu;
  i, treffer, pinguup, fehler : integer;
  public
    procedure drehen;
  end;

var
  FRM_pingu: TFRM_pingu;

implementation

uses UNT_main;


{$R *.dfm}


wo muss ich meine selbstgeschriebenen proceduren (dateisichern_l, dateiladen_l) aus UNT_main hinschreiben damit ich sie in UNT_pingu verwenden kann?
(meine fragestellung entwas konkreter)
die aufgabe der ich im moment nachgehe ist objektorientierte programmierung und deshalb komm ich ich mit diesen ganzen sachen irgendwie durcheinander.


Jakob Schöttl - So 04.02.07 12:51

user profile iconGigaNeko hat folgendes geschrieben:
wo muss ich meine selbstgeschriebenen proceduren (dateisichern_l, dateiladen_l) aus UNT_main hinschreiben damit ich sie in UNT_pingu verwenden kann?

das kommt darauf an, ob deine beiden Proceduren (dateisichern_l, dateiladen_l) zu der Klasse aus UNT_main (TFRM_main) gehören sollen, oder allgemein zur Unit UNT_main.

Wenn die Proceduren allgemein zur Unit UNT_main gehören sollen, dann sollte die UNT_main so aussehen:

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

interface

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

type
  TFRM_main = class(TForm)
    LBL_tempo: TLabel;
    COB_tempo: TComboBox;
    BTN_start: TBitBtn;
    LBL_treffer: TLabel;
    LBL_drehungen: TLabel;
    LBL_fehler: TLabel;
    LBL_c: TLabel;
    LBL_highscore: TLabel;
    SGR_highscore: TStringGrid;
    procedure BTN_startClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure COB_tempoChange(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

procedure dateisichern_l;
procedure dateiladen_l;

var
  FRM_main: TFRM_main;

implementation

uses UNT_pingu; //unwichtig


{$R *.dfm}

procedure dateisichern_l;
begin
end;

procedure dateiladen_l;
begin
end;

Nun müsstest du die beiden proceduren aus der anderen Unit UNT_pingu ohne Fehler aufrufen können.


GigaNeko - So 04.02.07 13:20

jo das geht danke. und wie ist das mit den variabeln aus der anderen unit, falls ich die auch mal brauche?


Jakob Schöttl - So 04.02.07 13:24

die müssen so deklariert sein, wie bei dir das bereits existierende

Delphi-Quelltext
1:
2:
var
  FRM_main: TFRM_main;

also im Interface-Abschnitt vor der Implementation. Das kann dann zB. so aussehen:

Delphi-Quelltext
1:
2:
3:
var
  FRM_main: TFRM_main;
  aVariable: integer;


Allerdings musst du immer überlegen, ob die Variable wirklich nur zur Unit gehört (also so wie in meinem Beispiel), oder ob sie doch zur Klasse TFRM_main gehört. In diesem Fall schreibt man die Variable dann im public-Bereich.


MSC - So 04.02.07 14:07
Titel: Re: procedure auf einer anderen unit benutzen???
Also ich mache mir das immer recht einfach, wenn ich ne 2., 3. usw. unit verwenden möchste:

Zuerst habe ich die Unit1, dann gehe ich auf Datei > Neu > Formular.
So, dann habe ich 2 Units und formulare.
Dann gehe ich in Unit1 auf Datei > Unit verwenden... Unit2 auswählen.
Dann das ganze noch für Unit2 machen, fertig.

Dann ist gibt es idR. keine Probleme mit Prozeduren und Variablen aus anderen Units