Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Procedure nicht sichtbar... (https://www.delphipraxis.net/63926-procedure-nicht-sichtbar.html)

bluescreen25 24. Feb 2006 17:17


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.
...
...
...

Dust Signs 24. Feb 2006 17:21

Re: Procedure nicht sichtbar...
 
In deinem Fall sind die Prozeduren Methoden deiner Form. Du kannst Sie daher nur über
Delphi-Quellcode:
NameDerInstanzDeinerForm.Funktionsname();
aufrufen - oder du machst es schön und gibst die Methoden aus der Form raus - in eine extra Unit ;)

Dust Signs

jfheins 24. Feb 2006 17:27

Re: Procedure nicht sichtbar...
 
Warum hast du dir deinen Avatar ausgesucht? Der würde fast passen :mrgreen:

Zitat:

In deinem Fall sind die Prozeduren Methoden deiner Form.
Welcher Form ?

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;

Dust Signs 24. Feb 2006 17:28

Re: Procedure nicht sichtbar...
 
Ups :oops: Hab den Code wohl zu schnell angeschaut; eine Instanz braucht er trotzdem...

Dust Signs

bluescreen25 24. Feb 2006 17:29

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:

Luckie 24. Feb 2006 17:37

Re: Procedure nicht sichtbar...
 
Tutorial: http://www.michael-puff.de/dirindex....phi/Tutorials/

bluescreen25 24. Feb 2006 17:45

Re: Procedure nicht sichtbar...
 
Zitat:

Zitat von Luckie

Danke, das gibt mal Einblicke in die Struktur...

bluescreen25 24. Feb 2006 18:21

Re: Procedure nicht sichtbar...
 
Ist das eine geeignete Art und Weise ? Funktioniert aber ist es üblich ?

Delphi-Quellcode:
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.
...
...
...
Hier ein Beispielaufruf aus einer anderen Unit/Form:

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;

Luckie 24. Feb 2006 18:25

Re: Procedure nicht sichtbar...
 
Warum instanzierst du im Konstruktor die eigene Klasse? Du brauchst eigentlich auch keinen eigenen Konstruktor:

Delphi-Quellcode:
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.
//...
Und wozu die globale Variable PowerOff?

bluescreen25 24. Feb 2006 18:33

Re: Procedure nicht sichtbar...
 
Zitat:

Zitat von Luckie
Warum instanzierst du im Konstruktor die eigene Klasse? Du brauchst eigentlich auch keinen eigenen Konstruktor:

Delphi-Quellcode:
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.
//...
Und wozu die globale Variable PowerOff?

Genau das war eingangs mein Problem. Wie ich sonst die proceduren hier aus einer anderen Form erreichen kann. Obwohl die public sind gehts nicht....

Luckie 24. Feb 2006 18:42

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:
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;
Du solltest dir mal das Tutorial durchlesen, dann weißt du auch, was es mit den Sichtbarkeiten auf sich hat.

bluescreen25 24. Feb 2006 19:11

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:
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;
der Aufruf aus der anderen Form/Unit dann:

Delphi-Quellcode:
procedure Tmediaplayer_frm.Image14Click(Sender: TObject);
var
  SShutDown: TShutDown;
begin
  SShutDown := TShutDown.Create;
  try
    SShutDown.beenden;
  finally
    FreeAndNil(SShutDown);
  end;
end;
:-D

Luckie 24. Feb 2006 19:15

Re: Procedure nicht sichtbar...
 
Nein, das ist immer nochnicht korrekt. Was hat die Unit deines Formulares in der Unit deiner Klasse zu suchen?

bluescreen25 24. Feb 2006 19:20

Re: Procedure nicht sichtbar...
 
Zitat:

Zitat von Luckie
Nein, das ist immer nochnicht korrekt. Was hat die Unit deines Formulares in der Unit deiner Klasse zu suchen?

Stimmt , habe es oben im Code editiert. Du siehst aber auch ALLES ! :shock:

Luckie 24. Feb 2006 19:24

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.

bluescreen25 24. Feb 2006 19:46

Re: Procedure nicht sichtbar...
 
Zitat:

Zitat von Luckie
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.

Nun ja, das ist aber jetzt etwas sehr eng gesehen. Ich habe den Aufruf in der "mediaplayer_frm" unabhängig von der Klasse gemacht, so wie du es gezeigt hast.

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 ?

jfheins 24. Feb 2006 19:53

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;

bluescreen25 24. Feb 2006 20:24

Re: Procedure nicht sichtbar...
 
Zitat:

Zitat von jfheins
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;

Das habe ich mal so umgesetzt, funktioniert und ist hoffentlich jetzt einwandfrei....lol

Delphi-Quellcode:
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.
...
...
eine globale Procedure in der Main_frm:

Delphi-Quellcode:
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;
ein Beispielaufruf:

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