Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Private Variable "verweigert Zutritt" (https://www.delphipraxis.net/163259-private-variable-verweigert-zutritt.html)

VinzRitt 21. Sep 2011 22:52

Private Variable "verweigert Zutritt"
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallö,
Ich bin noch ein ziemlicher Neuling, was Klassen in Delphi betrifft. In meinem Informatikkurs haben wird es heute erst begonnen. Das System der OOP ist mir aber von C++ bereits geläufig, da habe ich mir gedacht: Mach es Mal fertig, aber kaum eine Stunde programmiert, sind meine Grundfeste erschüttert. Hier der problematische Ausschnitt
Delphi-Quellcode:
unit main;

interface

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

type
  TWuerfel = class (TObject)
  private
    // Membervariablen
    m_Augen: integer;
  public
    // Memberfunktionen
    function getAugen (): integer;
    procedure setAugen (worth:      integer);

    procedure werfen  (TBBActual: TBitBtn);
  end;

var
  Wuerfel:   array[1..3] of TWuerfel;

implementation

{$R *.dfm}

//TWuerfel
//Memberfunktionen
// getAugen
function TWuerfel.getAugen (): integer;
begin
  getAugen:= m_Augen;
end; //getAugen

// setAugen
procedure TWuerfel.setAugen (worth: integer);
begin
  m_Augen:= worth;  // Hier wird Zugriffsverletzung angezeigt
end; //setAugen

//Beliebige Funktionen
// werfen
// Aufgabe: Zufallszahl bestimmen und auf Würfel ausgeben
procedure TWuerfel.werfen (TBBActual: TBitBtn);
begin
  // Zufallszahl würfeln
  randomize;

  setAugen (random (6)+1);

  // Ergebnis anzeigen
  TBBActual.Glyph.LoadFromFile (intToStr (getAugen) + '.bmp');
end; //werfen

end.
Tja, setAugen tritt mein Problem auf, eine Zugriffsverletzung. Fehlermeldung im Anhang.

Meine Frage ... Hat das überhaupt etwas mit der Variable an sich zu tun? Denn diese habe ich lustig hin und her geschoben und der Fehlercode bleibt immer der gleiche. Wie sähen Mögliche Lösungen aus? Ich hoffe man kann mir helfen!!!


Danke im Voraus
Vinzent Rittel

Luckie 21. Sep 2011 22:56

AW: Private Variable "verweigert Zutritt"
 
Hast du auch irgendwo die Klasse erzeugt?

VinzRitt 21. Sep 2011 23:36

AW: Private Variable "verweigert Zutritt"
 
wie meinen?

Edit: Die Klasse wird ja aufgerufen, per Debugger bin ich auch einige Schritte in Prozeduren der Klasse navigiert. Auch setAuge () lässt sich aufrufen, aber m_Auge will einfach keinen Wert annehmen (lässt sich übrigens auch nicht über Debugger als Ausdruck überwachen)

Luckie 21. Sep 2011 23:45

AW: Private Variable "verweigert Zutritt"
 
Zitat:

Zitat von VinzRitt (Beitrag 1125905)
Die Klasse wird ja aufgerufen,

Dann zeig mal wie.

VinzRitt 21. Sep 2011 23:54

AW: Private Variable "verweigert Zutritt"
 
Hier der Abgespeckte Quelltext:

Delphi-Quellcode:
unit main;

interface

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

type
  TForm1 = class(TForm)
    LPunktzahl: TLabel;
    BBWuerfel1: TBitBtn;
    BBWuerfel2: TBitBtn;
    BBWuerfel3: TBitBtn;
    procedure BBWuerfel1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

type
  TWuerfel = class (TObject)
  private
    // Membervariablen
    Augen: integer;
  public
    // Memberfunktionen
    function getAugen (): integer;
    procedure setAugen (worth:      integer);

    procedure werfen  (TBBActual: TBitBtn);
  end;

var
  Form1:     TForm1;
  Wuerfel:   array[1..3] of TWuerfel;

implementation

{$R *.dfm}

//TWuerfel
//Memberfunktionen
// getAugen
function TWuerfel.getAugen (): integer;
begin
  getAugen:= Augen;
end; //getAugen

// setAugen
procedure TWuerfel.setAugen (worth: integer);
begin
  Augen:= worth; // Hier wird Zugriffsverletzung angezeigt
end; //setAugen

//Beliebige Funktionen
// werfen
// Aufgabe: Zufallszahl bestimmen und auf Würfel ausgeben
procedure TWuerfel.werfen (TBBActual: TBitBtn);
begin
  // Zufallszahl würfeln
  randomize;

  setAugen (random (6)+1);      

  // Ergebnis anzeigen
  TBBActual.Glyph.LoadFromFile (intToStr (getAugen) + '.bmp');
end; //werfen


//TForm1
// BBWuerfel1Click
procedure TForm1.BBWuerfel1Click(Sender: TObject);
begin
  Wuerfel[1].werfen (BBWuerfel1);
end; //BBWuerfelClick

end.

Luckie 22. Sep 2011 00:01

AW: Private Variable "verweigert Zutritt"
 
Und wo wird eine Instanz der Klasse erzeugt? Du solltest dich noch mal mit den Grundlagen auseinandersetzen: http://www.michael-puff.de/Programmi...phi/Tutorials/

VinzRitt 22. Sep 2011 00:05

AW: Private Variable "verweigert Zutritt"
 
nochmal ist gut, ich habe das in delphi noch NIE gemacht!!!

Aber danke!!! Bei google, hab ich dazu nämlich WENIG hilfreiches bekommen...

Luckie 22. Sep 2011 00:13

AW: Private Variable "verweigert Zutritt"
 
Delphi-Quellcode:
type
  TWuerfel = class (TObject)
  private
    FAugen: integer;
    function GetAugen: Integer;
    procedure SetAugen(Value: Integer);
  public  
    property Augen: Integer read GetAugen write SetAugen;
    procedure Werfen (TBBActual: TBitBtn);
  end;

var
  Form1: TForm1;
  Wuerfel: array[1..3] of TWuerfel; // Warum global und nicht ein Feld der TForm Klasse??

Luckie 22. Sep 2011 00:27

AW: Private Variable "verweigert Zutritt"
 
Delphi-Quellcode:
type
  TWuerfel = class (TObject)
  private
    FAugen: integer;
    function GetAugen: Integer;
    procedure SetAugen(Value: Integer);
  public
    property Augen: Integer read GetAugen write SetAugen;
    Constructor Create;
    procedure Werfen;
  end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    FWuerfel: TWuerfel;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TWuerfel }

constructor TWuerfel.Create;
begin
  Randomize;
end;

function TWuerfel.GetAugen: Integer;
begin
  Result := FAugen;
end;

procedure TWuerfel.SetAugen(Value: Integer);
begin
  FAugen := Value;
end;

procedure TWuerfel.Werfen;
var
  Augen: Integer;
begin
  Augen := Random(6) + 1;
  SetAugen(Augen);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FWuerfel := TWuerfel.Create;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Augen: Integer;
begin
  FWuerfel.Werfen;
  Augen := FWuerfel.Augen;
  ShowMessage(IntToStr(Augen));
end;

VinzRitt 22. Sep 2011 00:38

AW: Private Variable "verweigert Zutritt"
 
Darauf wär ich wohl nicht gekommen. Ich denke ich arbeite es stück für Stück auf. Mein Lehrer erklärts eh erst nächste Woche, also hab ich noch das WE um es vorher zu können. Die Lösung ist nachvollziehbar.

Wielen Dank also

P.S In C++ ist das irgendwie doch nicht unwesentlich einfacher Konstruiert.




-CLOSED-


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 Uhr.
Seite 1 von 2  1 2      

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