Autor Beitrag
GigaNeko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Sa 03.02.07 19:40 
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
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 03.02.07 19:48 
einfach, in dem du in unit drei folgenden code einfügst und diesen code aufrufst:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure starte_funktion_aus_unit2_dann_aus_unit1;
begin
 unit2.deinefunktion;
 unit1.deinefunktion;
end;
Fabian E.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 554

Windows 7 Ultimate
Visual Studio 2008 Pro, Visual Studion 2010 Ultimate
BeitragVerfasst: Sa 03.02.07 20:01 
oder
 uses ....,unit1,... bei unit 2
ausblenden Delphi-Quelltext
1:
2:
3:
4:
 TForm2.procedurxyz();
begin
procedure_aus_unit1;
end;
GigaNeko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: 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)


Zuletzt bearbeitet von GigaNeko am So 04.02.07 12:33, insgesamt 1-mal bearbeitet
IngoD7
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: So 04.02.07 12:40 
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:
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
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:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: 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:
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:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: So 04.02.07 13:24 
die müssen so deklariert sein, wie bei dir das bereits existierende
ausblenden Delphi-Quelltext
1:
2:
var
  FRM_main: TFRM_main;

also im Interface-Abschnitt vor der Implementation. Das kann dann zB. so aussehen:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 63

Win XP Home, Win Vista Buisiness
Delphi 7 Enterprise
BeitragVerfasst: So 04.02.07 14:07 
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