Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Procedure Public?


Delphi2009lover - Fr 25.09.09 14:58
Titel: Procedure Public?
Also Hallo erstmal^^

Ich hab da ein kleines Problem...

ich habe zwei Units...


HauptUnit
EditUnit


In der HauptUnit habe ich eine Procedure die "Listboxfuellen" heißt. Ich möchte jetzt, dass man diese über die EditUnit aufgerufen wird.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
unit SchuelerUnit;

interface

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

type
  THauptForm = class(TForm)
    UserListbox: TListBox;
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    Userdatenbearbeiten1: TMenuItem;
    procedure Userdatenbearbeiten1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public

  end;

Ich habe mir jetzt gedacht dass ich die Procedure einfach unter die Public Deklarationen schreib aber das geht nicht und wenn ich sie da nicht rein schreiben wird sie nicht angezeigt (HauptUnit.HauptForm.Listboxfuellen exestiert nicht)

Wie kann ich die procedur jetzt public machen sodass ich sie dann über die Edit unit aufrufen kann?

Moderiert von user profile iconKha: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: Topic aus VCL (Visual Component Library) verschoben am Fr 25.09.2009 um 15:07


Narses - Fr 25.09.09 15:10

Moin!

Schonmal in die Suche geschaut? Suche in: Delphi-Forum, Delphi-Library FORMULAR UNIT ZUGRIFF :lupe: :les: :think: ;)

cu
Narses


mkinzler - Fr 25.09.09 16:08

Muss im Interfacs stehen


Delphi2009lover - Fr 25.09.09 16:30

ich habs souw versucht :autsch:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
unit Unit4;

interface

procedure Test();
begin

end;

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

type
  TForm4 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;


Delphi2009lover - Fr 25.09.09 16:31

geht ned...


jaenicke - Fr 25.09.09 16:37

Wenn du das unter public schreibst, dann wäre das schon richtig. Wenn du das dort hinschreibst und es nicht klappt, machst du dabei etwas falsch oder der Fehler liegt woanders.

So wie du es jetzt schreibst, hieße das quasi (abgesehen davon, dass das begin..end nix oben bei der Deklaration zu suchen hat), dass Test nur zu der Unit, nicht aber zum Formular gehört. Dann wäre das aber dort oben auch die falsche Stelle, sondern gehört zwar in interface, aber direkt über implementation z.B., nicht ganz oben.

Wie hattest du es denn unter public versucht?


Tjeri - Sa 26.09.09 09:20

Schreib die procedure einfach ganz normal, aber lass die zuweisung zu der speziellen Unit bzw. zu dem speziellen Formblatt weg


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 Test;

interface

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

type
  TFormblatt = class(TForm)
    procedure TestProcedure;

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Formblatt: TFormblatt;

implementation

procedure TestProcedure
var
begin
end;


in dem Fall wäre das dann procedure TestProcedure, die du einfach so wie sie ist schreiben musst. Du darfst aber nicht unten im Quellcode dann schreiben procedure TFormblatt.TestProcedure, weil dann kannst du sie nur von dort aus aufrufen(soweit ich weiß), Lass das TFormblatt. weg und dann klappt es auch indem du einfach in der anderen Unit die procedure mit TestProcedure aufrufst ;-)


jaenicke - Sa 26.09.09 10:22

Also so funktioniert es schonmal gleich gar nicht...
Du deklarierst die Methode oben als zu TFormblatt gehörig, unterhalb von implementation jedoch gibt es gar keine Implementierung dazu. Denn die Prozedur, die da steht, gehört ja nicht zu TFormblatt. Die beiden Deklarationen passen nicht zusammen. --> Kompilierfehler.
Zudem sollte man nichts außerhalb von public usw. mit der Default-Sichtbarkeit deklarieren, sondern wirklich explizit das einordnen unter public, private usw.

Richtig wäre die Deklaration so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
type
  TMyForm = class(TForm)
  private
  public
    procedure MyProcedure;
  end;

var
  MyForm: TMyForm;

implementation

procedure TMyForm.MyProcedure;
begin

end;
Dann lässt sich das auch von anderen Units aus aufrufen mit MyForm.MyProcedure, sofern die Unit in der uses steht. Wenn man aber mehrere Instanzen des Formulars hat, muss man statt MyForm auch die richtige nehmen.

Was du jetzt meintest, ist eine Prozedur, die nicht auf das Formular zugreift, sondern lose in der Unit hängt. Die könnte man dann aber auch einfach in der anderen Unit deklarieren, wenn die nicht zum Formular gehört. Das ist hier wohl kaum gewünscht. Aber ich schreibe das trotzdem einmal dazu wie es dann richtig aussieht:

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

var
  MyForm: TMyForm;

procedure MyProcedure;

implementation

procedure MyProcedure;
begin

end;
Aufrufen geht dann in der Tat einfach mit MyProcedure. Man sollte daraus dann aber niemals das Formular ansprechen, da man dann bei mehreren Instanzen davon Probleme bekommt. So deklariert gehört eine Prozedur nur, wenn sie nichts mit einer bestimmten Instanz des Formulars zu tun hat.