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 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
Kha: Delphi-Tags hinzugefügtModeriert von
Narses: 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?
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 public 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 public 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.
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!