![]() |
Procedure nicht sichtbar...
Hallo, ich habe das Problem, das die proceduren der eingebundene Unit in meinen anderen Units nicht sichtbar sind. Wahrscheinlich ein Anfängerproblem. Wer kann helfen ?
PS: in den anderen Units ist diese in Uses eingebunden.
Delphi-Quellcode:
unit ShutDown;
interface uses Windows, Messages, SysUtils, Classes; type TShutDown = class(TObject) public procedure Shutdown(PowerOff,Force :boolean); procedure Ruhezustand(Force :boolean); procedure Standby(Force :boolean); procedure Logoff(Force : boolean); procedure Restart(Force :boolean); procedure GetPrivileges; end; implementation procedure TShutDown.GetPrivileges; //Rechte um runterzufahren holen. ... ... ... |
Re: Procedure nicht sichtbar...
In deinem Fall sind die Prozeduren Methoden deiner Form. Du kannst Sie daher nur über
Delphi-Quellcode:
aufrufen - oder du machst es schön und gibst die Methoden aus der Form raus - in eine extra Unit ;)
NameDerInstanzDeinerForm.Funktionsname();
Dust Signs |
Re: Procedure nicht sichtbar...
Warum hast du dir deinen Avatar ausgesucht? Der würde fast passen :mrgreen:
Zitat:
Um diese Methoden zu verwenden muss man mit Objekten (und Klassen) arbeiten, man kann die Prozeduren nicht einfach aufrufen ;) Beispiel:
Delphi-Quellcode:
var
ShutdownObj: TShutdown; begin ShutdownObj := TShutdown.Create; // Das zuerst try ShutdownObj.GetPrivileges; // Das geht jetzt ... finally FreeAndNil (ShutdownObj); // Und wieder freigeben ... end; end; |
Re: Procedure nicht sichtbar...
Ups :oops: Hab den Code wohl zu schnell angeschaut; eine Instanz braucht er trotzdem...
Dust Signs |
Re: Procedure nicht sichtbar...
Öhm, diese unit hat keine Form und soll eigendlich auch nicht. Deshalb kann ich die instanz auch nicht aufrufen, bzw nur TShutDown.create, aber nicht die Proceduren. :oops:
|
Re: Procedure nicht sichtbar...
|
Re: Procedure nicht sichtbar...
Zitat:
|
Re: Procedure nicht sichtbar...
Ist das eine geeignete Art und Weise ? Funktioniert aber ist es üblich ?
Delphi-Quellcode:
Hier ein Beispielaufruf aus einer anderen Unit/Form:
unit ShutDown;
interface uses Windows, Messages, SysUtils, Classes; type TShutDown = class(TObject) private constructor create; destructor destroy; public procedure Shutdown(PowerOff,Force :boolean); procedure Ruhezustand(Force :boolean); procedure Standby(Force :boolean); procedure Logoff(Force : boolean); procedure Restart(Force :boolean); procedure GetPrivileges; end; var ShutDownObj : TShutDown; PowerOff: boolean; implementation constructor TShutDown.create; begin ShutdownObj := TShutdown.Create; end; destructor TShutDown.destroy; begin ShutDownObj.Free; inherited Destroy; end; procedure TShutDown.GetPrivileges; //Rechte um runterzufahren holen. ... ... ...
Delphi-Quellcode:
procedure Tmediaplayer_frm.Image14Click(Sender: TObject);
begin case config_frm.ShutdownSelect.ItemIndex of 0: begin Main_frm.Close; end; 1: begin Main_frm.Close; ShutDownObj.Shutdown(PowerOff,config_frm.ShutDown_force_select.Checked); end; end; end; |
Re: Procedure nicht sichtbar...
Warum instanzierst du im Konstruktor die eigene Klasse? Du brauchst eigentlich auch keinen eigenen Konstruktor:
Delphi-Quellcode:
Und wozu die globale Variable PowerOff?
unit ShutDown;
interface uses Windows, Messages; type TShutDown = class(TObject) private procedure GetPrivileges; public procedure Shutdown(PowerOff,Force :boolean); procedure Ruhezustand(Force :boolean); procedure Standby(Force :boolean); procedure Logoff(Force : boolean); procedure Restart(Force :boolean); end; var PowerOff: boolean; implementation procedure TShutDown.GetPrivileges; //Rechte um runterzufahren holen. //... |
Re: Procedure nicht sichtbar...
Zitat:
|
Re: Procedure nicht sichtbar...
Natürlich sind sie das:
Delphi-Quellcode:
unit Unit2;
interface uses Dialogs; type TDummy = class(TObject) private procedure Foobar; public procedure DoSomeThing; end; implementation procedure TDummy.DoSomething; begin ShowMessage('Kuckuck'); end; procedure TDummy.Foobar; begin ShowMessage('Foobar'); end; end.
Delphi-Quellcode:
Du solltest dir mal das Tutorial durchlesen, dann weißt du auch, was es mit den Sichtbarkeiten auf sich hat.
uses
Unit2; procedure TForm1.Button1Click(Sender: TObject); var Dummy: TDummy; begin Dummy := TDummy.Create; try //Dummy.Foobar; // geht nicht da private Dummy.DoSomeThing; // geht da public finally FreeAndNil(Dummy); end; end; |
Re: Procedure nicht sichtbar...
Ich habe das Ganze nochmal überdacht und den Aufruf der proceduren global geregelt. Dank eurer Hilfe sollte es hoffentlich so korrekt sein:
Delphi-Quellcode:
der Aufruf aus der anderen Form/Unit dann:
unit ShutDown;
interface uses Windows, Messages, SysUtils, Classes; type TShutDown = class(TObject) private procedure GetPrivileges; procedure Shutdown(PowerOff,Force :boolean); procedure Ruhezustand(Force :boolean); procedure Standby(Force :boolean); procedure Logoff(Force : boolean); procedure Restart(Force :boolean); public procedure beenden; end; implementation uses Config,main_menue; procedure TShutDown.GetPrivileges; //Rechte um runterzufahren holen. ... ... ... procedure TShutDown.beenden; begin case config_frm.ShutdownSelect.ItemIndex of 0: begin Main_frm.Close; end; 1: begin Main_frm.Close; Shutdown(true,config_frm.ShutDown_force_select.Checked); end; 2: begin Ruhezustand(config_frm.ShutDown_force_select.Checked); end; 3: begin Standby(config_frm.ShutDown_force_select.Checked); end; 4: begin Main_frm.Close; Restart(config_frm.ShutDown_force_select.Checked); end; end; end;
Delphi-Quellcode:
:-D
procedure Tmediaplayer_frm.Image14Click(Sender: TObject);
var SShutDown: TShutDown; begin SShutDown := TShutDown.Create; try SShutDown.beenden; finally FreeAndNil(SShutDown); end; end; |
Re: Procedure nicht sichtbar...
Nein, das ist immer nochnicht korrekt. Was hat die Unit deines Formulares in der Unit deiner Klasse zu suchen?
|
Re: Procedure nicht sichtbar...
Zitat:
|
Re: Procedure nicht sichtbar...
Die ist ja immer noch da drinne: Config Die Klass eist somit immer noch abhängig von deiner Form und das ist unsauber und das macht man nicht. Wie es richtig geht hab eich dir in meinem Beispiel gezeigt.
|
Re: Procedure nicht sichtbar...
Zitat:
Das die "Config_frm" jetzt noch in der Implementation der Klasse steht, liegt ja daran, das ich die Case-Abfrage ja mit in die Unit gepackt habe und mir aus der "Config_frm" die Auswahl der Radiogroup (wie beendet werden soll) hole. Somit habe ich alles mit einer procedure (SShutDown.beenden;) erschlagen. Du meinst jetzt wahrscheinlich, das ich ALLE proceduren aus den Forms heraus ansprechen soll, um die Unit sauber zu halten. Da müsste ich doch wiedrum alle proceduren in Public setzen. Der Aufruf aus weiteren Forms ist doch so auch schneller,oder???? In einer Unit muss ich es ja global einsetzen, wegen der Möglichkeit der Wiederverwendung. Oder bin ich wieder auf dem falschen Dampfer ? |
Re: Procedure nicht sichtbar...
Wie wäre es, wenn due es so in der Art machst:
Delphi-Quellcode:
uses Shutdown, ConfigForm;
procedure TMainForm.Beenden; var ShutdownObj: TShutdown; begin ShutdownObj := TShutdown.Create; try case config_frm.ShutdownSelect.ItemIndex of 0: Close; 1: ShutdownObj.Shutdown (...); 2: ... end; finally FreeAndNil (ShutdownObj); end; end; |
Re: Procedure nicht sichtbar...
Zitat:
Delphi-Quellcode:
eine globale Procedure in der Main_frm:
unit ShutDown;
interface uses Windows, Messages, SysUtils, Classes; type TShutDown = class(TObject) private procedure GetPrivileges; public procedure Shutdown(PowerOff,Force :boolean); procedure Ruhezustand(Force :boolean); procedure Standby(Force :boolean); procedure Logoff(Force : boolean); procedure Restart(Force :boolean); end; implementation procedure TShutDown.GetPrivileges; //Rechte um runterzufahren holen. ... ...
Delphi-Quellcode:
ein Beispielaufruf:
procedure TMain_frm.MMPlayer_beenden;
var SShutDown: TShutDown; begin SShutDown := TShutDown.Create; try case config_frm.ShutdownSelect.ItemIndex of 0: begin Close; end; 1: begin Close; SShutDown.Shutdown(true,config_frm.ShutDown_force_select.Checked); end; 2: begin SShutDown.Ruhezustand(config_frm.ShutDown_force_select.Checked); end; 3: begin SShutDown.Standby(config_frm.ShutDown_force_select.Checked); end; 4: begin Close; SShutDown.Restart(config_frm.ShutDown_force_select.Checked); end; end; finally FreeAndNil (SShutDown); end; end;
Delphi-Quellcode:
procedure Tmediaplayer_frm.Image14Click(Sender: TObject);
begin Main_frm.MMPlayer_beenden; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz