Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Eigene Klasse global deklarieren (https://www.delphipraxis.net/92358-eigene-klasse-global-deklarieren.html)

Nikolas 18. Mai 2007 14:09


Eigene Klasse global deklarieren
 
Hallo

Ich habe eine Klasse geschrieben und sie in eine eigene Unit ausgelagert.
Wenn ich jetzt in einem Programm diese Klasse nutzen will, und sie z.B. im onclick eines Button deklariere und das create aufrufe, funktioniert sie so, wie sie soll.
Wenn ich sie Klasse jetzt aber global deklariere und das create ins Form1.oncreate oder in einen Button schreibe, bekomme ich eine Zugriffsverletzung.

Weiss jemand, warum ich das nicht darf?

Apollonius 18. Mai 2007 14:15

Re: Eigene Klasse global deklarieren
 
Etwas Code wäre ganz praktisch, aber prinzipiell verboten ist das meines Wissens nicht.

Die Muhkuh 18. Mai 2007 14:22

Re: Eigene Klasse global deklarieren
 
Hallo Nikolas,

was verstehst Du unter global deklarieren? Das hier:

Delphi-Quellcode:
TEineKlasse = class(TObject)
{ Procedures and more}
end;

implementation

var
  eineKlasse: TEineKlasse

Nikolas 18. Mai 2007 14:39

Re: Eigene Klasse global deklarieren
 
Ich meine das hier:
Delphi-Quellcode:
unit Unit1;

interface

uses
   Testklasse , classes, ....;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  m: ttest;

Die Muhkuh 18. Mai 2007 14:40

Re: Eigene Klasse global deklarieren
 
Hi Nikolas,

was macht diese Klasse denn? Wo genau kommt diese Zugriffsverletzung?

Vielleicht kannst Du die Klasse ja auch mal posten. (constructor dürfte genügen)

Nikolas 18. Mai 2007 14:48

Re: Eigene Klasse global deklarieren
 
Delphi-Quellcode:
unit Testklasse;

interface

uses SysUtils, Dialogs, ShellApi,ShellApiEx, Windows,Forms,StdCtrls,Classes;

type

TTest = class(TObject)
  public
  Klammerliste: TStringlist; // hier werden die schließenden Klammern hinterlegt
  constructor create;
    // legt Klammer ab
    procedure PushKlammer(str: string);

 end;


implementation

constructor TTest.create;
begin
Klammerliste := TStringlist.create;
end;


procedure TTest.PushKlammer(str: string);
{ Dieser Funktion wird die öffnende Klammer übergeben,
der schließende Ausdruck wird auf dem Stack abgelegt }
var
strb: string;
begin
strb:=str;

Klammerliste.Add(strb);
showmessage(Klammerliste.Text);

end;
mit
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
//var
//m: Ttest;
begin
m.Create;
m.PushKlammer('(');
end;
bekomme ich den Fehler mit dem Listenmaximum bei schließen den Programms nachden Pushklammer das getan hat, was es soll und mit der oben genannten Version bekomme ich eine Zugriffsverletzung sobald ich auf den Button klicke.

Jelly 18. Mai 2007 14:52

Re: Eigene Klasse global deklarieren
 
Was soll denn
Delphi-Quellcode:
m.Create ;
bewirken :gruebel:

m ist doch deine Instanz der TTest Klasse. Die erstellt man so:

Delphi-Quellcode:
m := TTest.Create ;

Die Muhkuh 18. Mai 2007 14:53

Re: Eigene Klasse global deklarieren
 
Zitat:

Zitat von Nikolas
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
//var
//m: Ttest;
begin
m.Create;
m.PushKlammer('(');
end;

:mrgreen:

Ich würds ja mal mit:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
//var
//m: Ttest;
begin
m := TTest.Create; // <<
m.PushKlammer('(');
end;
versuchen. :mrgreen:

Nikolas 18. Mai 2007 14:57

Re: Eigene Klasse global deklarieren
 
äh, Jelly, du bist doch Moderator... könntest du den Thread vielleicht unauffällig verschwinden lassen, oder als warndendes Beispiel für folgende Generationen stehenlassen?

Danke euch beiden. :thumb:

insgesamt ein Fall für :wall: und :duck:

Aber stopp mal. Warum funktioniert es denn dann, wenn ich m nur für den Button einführe?

Gremlin 18. Mai 2007 19:43

Re: Eigene Klasse global deklarieren
 
Zitat:

Zitat von Nikolas
Aber stopp mal. Warum funktioniert es denn dann, wenn ich m nur für den Button einführe?

Wie meinst du das mit dem einführen?

btw: Fehlt da nicht der destructor

Delphi-Quellcode:
  TTest = class(TObject)
  public
    Klammerliste: TStringlist;
    destructor Destroy; override;
    [..]

destructor TTest.Destroy;
begin
  Klammerliste.Free;
  inherited;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz