![]() |
Globale Variablen!
Hi Leuts.
ich habe wiedereinmal ein kleines Problemchen! Also: Wie mache ich das, wenn man keine Globalen Variablen verwenden sollte, aber man möchte das z.b.alle Objekte (Forschungsfabrik, Panzer, Mine..... irgendwas) auf ein Feld von Spieler zugreifen können z.B. Geld, denn wenn ich eine Mine baue dann kostet das ja was ! Wenn ich nun also eine Klasse erstelle
Delphi-Quellcode:
type
TSpieler = class public Geld:Integer; end; Und dann Im OnCreate Bereich des Forms:
Delphi-Quellcode:
halt Geld zuweise dann ist das ja nur für das Formular bzw. für die OnCreate Ereignisroutine gültig und wenn ich das nun irgendwo anders verwenden will dann ist zwar die dekleration gültig aber nicht die Implementation da das Objekt ja Quasi 2 mal erstellt wird!
var Spieler: TSpieler;
begin Spieler:= TSpieler.Create; Spieler.Geld:= 10000 end; |
Re: Globale Variablen!
Zitat:
mfg Christian |
Re: Globale Variablen!
Zitat:
und ansonsten: die anderen klassen wie z.b. TSpieler müssen einfach eine variable vom typ TGeld haben, und wenn du einen TSpieler createst, bekommt er entweder sein eigenes Geld (das eigene TGeld wird created) oder er bekommt das geld von anderen, dann musst du nur dem TGeld des TSpielers eine bereits erzeugte variable vom typ TGeld zuweisen. |
Re: Globale Variablen!
Zitat:
Aber ich denke auch, dass man bei einer Instanz, die wirklich überall benötigt wird, eine Ausnahme machen kann. |
Re: Globale Variablen!
Also,
Im Interface Teil:
Delphi-Quellcode:
Im Implementationsteil (in irgeneiner Routine):
Type
TSpieler = class(TObject) //Spielerklasse private Geld:Integer; //Feld von Spieler was das gesamte Geld des Spielers beinhalten soll end;
Delphi-Quellcode:
So nun hat der Spieler innerhalb der Routine 1000 Geld. Aber von überall soll man Geld verwenden können z.B.:
var Spieler: TSpieler
begin Spieler := TSpieler.create; Spieler.Geld := 1000; Spieler.free; end; Button1.Click:
Delphi-Quellcode:
Nun möchte ich aber das wasgeldkostet auf das Spielergeld zugreift! Ich weis nicht wie ichs genauer erklären soll was ich meine....
var Wasgeldkostet: TSpieler;
begin Wasgeldkostet := TSpieler.Create; Label1.caption := InToSTR(Wasgeldkostet.Geld) //würde nichts ergeben! end; |
Re: Globale Variablen!
dann musst du den Spieler eben in Private declarieren bzw. in Public (je nach dem wie sichtbar das werden soll.
Also wird das
Delphi-Quellcode:
zu
var Spieler: TSpieler
begin Spieler := TSpieler.create; Spieler.Geld := 1000; Spieler.free; end;
Delphi-Quellcode:
somit ist Spieler nicht Global und kann doch noch von überall genutzt werden.
TForm1 = class(TForm)
[...] public Spieler: TSpieler [...] procedure TForm1.FormCreate(Sender: TObject); begin Spieler := TSpieler.Create; end; [...] procedure TForm1.OneOfYourMoneyProcedures; begin Spielder.Geld := 1000; end; [...] procedure TForm1.FormDestroy(Sender: TObject); begin Spielder.Free; end; Somit können auch andere Objekte über Form1.Spieler darauf zugreifen |
Re: Globale Variablen!
Vielen vielen Dank, jetzt hab ich das prinzip verstanden :idea: Ich hab das nämlich nie ganz kapiert wie das gemeint ist mit den ,,Rahmenklassen" usw...
Ihr habt mir sehr geholfen! |
Re: Globale Variablen!
Noch eine kurze Frage,
wie würde das ganze aussehen wenn ich nicht Form1 als Rahmenklasse verwenden will, sondern eine extra Klasse welche alles zusammenfasst,also Spieler, Gebäude....usw. auf dem Heap erstellt und freigibt? Wäre ganz toll wenn wieder so ein hochverständlicher Quelltext als Antwort käme ! |
Re: Globale Variablen!
Na,
machs doch dann einfach so:
Delphi-Quellcode:
TRahmenklasse = class
private public Spieler1: TSpieler; Haus: TGebaeude; ... constructor Create; destructor Destroy; override; end; procedure TRahmenklasse.Create; begin Spieler1 := TSpieler.Create; Haus := TGebaeude.Create; end; procedure TRahmenklasse.Destroy; begin Spieler1.Free; Haus.Free; end; |
Re: Globale Variablen!
Hmm, was ist effektiv der Unterschied zwischen SirTs Lösung und einer globalen Vatriablen?... :gruebel:
Um dich nicht mit Interfaces zuzuschütten empfehle ich dir erstmal ein Singleton welches aus einer absrtakten öffentlichen Klasse und einer versteckten Klasse besteht, die die seine Member implementiert. Um zu verhindern, dass die Instanz zerstört wird, wird eine Exception im Destructor ausgelöst.
Delphi-Quellcode:
interface
type TSingletonMoneyDings = class private function getMoney: Currency; virtual; abstract; procedure setMoney(const aValue: Currency); virtual; abstract; public property Money: Currency read getMoney write setMoney; class function Instance: TSingletonMoneyDings; end; implementation uses SysUtils; type TRichtigesMoneyDings = class(TSingletonMoneyDings) private fMoney: Currency; fAllowDestruction: Boolean; function getMoney: Currency; override; procedure setMoney(const aValue: Currency); override; public destructor Destroy; override; end; InvalidSingletonDestructionException = class(Exception) public constructor Create; end; var staticMoneyDings : TRichtigesMoneyDings; { TSingletonMoneyDings } class function TSingletonMoneyDings.Instance: TSingletonMoneyDings; begin Result := staticMoneyDings; end; { TRichtigesMoneyDings } destructor TRichtigesMoneyDings.Destroy; begin if fAllowDestruction then inherited else raise InvalidSingletonDestructionException.Create(); end; function TRichtigesMoneyDings.getMoney: Currency; begin Result := fMoney; end; procedure TRichtigesMoneyDings.setMoney(const aValue: Currency); begin fMoney := aValue; end; { InvalidSingletonDestructionException } constructor InvalidSingletonDestructionException.Create; begin inherited CreateFmt('%s can not be destroyed at this time.', [TMoneyDings.ClassName]); end; initialization staticMoneyDings := TRichtigesMoneyDings.Create(); staticMoneyDings.fAllowDestruction := False; finalization staticMoneyDings.fAllowDestruction := True; staticMoneyDings.Free(); end. Benutzen kannst du sie von überall aus über Instanz:
Delphi-Quellcode:
TSingletonMoneyDings.Instance.Money := 1
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:06 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 by Thomas Breitkreuz