AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Globale Variablen!

Ein Thema von tmode00 · begonnen am 6. Jul 2005 · letzter Beitrag vom 6. Jul 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von tmode00
tmode00

Registriert seit: 21. Mai 2005
Ort: Gera
22 Beiträge
 
Delphi 7 Enterprise
 
#1

Globale Variablen!

  Alt 6. Jul 2005, 18:39
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:
var Spieler: TSpieler;
begin
Spieler:= TSpieler.Create;
Spieler.Geld:= 10000
end;
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!
Thomas Seidel
begin; 011010101101010100101010; end;
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#2

Re: Globale Variablen!

  Alt 6. Jul 2005, 18:52
Zitat von tmode00:
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!
Was machst du dir das denn hier so kompliziert? Mach den spieler einfach zu feld einer Klasse(von mir aus zum Feld der Form). Besser ist du erstellst dir ne "Rahmenklasse", die alle Objekte instanziert und wieder freigibt. Die kannst du IMHO auch ausnahmsweise global machen(Die Formvariable is ja auch Global; Wichtig is IMHO nur, dass du nicht alles, was Feld sein soll Global machst, dann hast du nämlich Chaos).

mfg
Christian
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Benutzerbild von BlackJack
BlackJack

Registriert seit: 2. Jul 2005
Ort: Coesfeld
246 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Globale Variablen!

  Alt 6. Jul 2005, 18:55
Zitat von tmode00:
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!
wie was wo? jetzt erklär nochmal genau wo die variablen stehen, wo die klassen erzeugt werden etc.

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.
See my shadow changing, stretching up and over me.
Soften this old armor. Hoping I can clear the way
By stepping through my shadow, coming out the other side.
Step into the shadow. Forty six and two are just ahead of me.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#4

Re: Globale Variablen!

  Alt 6. Jul 2005, 19:00
Zitat von r2c2:
Die Formvariable is ja auch Global
Dass Borland das so macht, heißt nicht, dass es auch gute OOP ist .
Aber ich denke auch, dass man bei einer Instanz, die wirklich überall benötigt wird, eine Ausnahme machen kann.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von tmode00
tmode00

Registriert seit: 21. Mai 2005
Ort: Gera
22 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Globale Variablen!

  Alt 6. Jul 2005, 19:08
Also,

Im Interface Teil:

Delphi-Quellcode:
Type
TSpieler = class(TObject) //Spielerklasse

private
Geld:Integer; //Feld von Spieler was das gesamte Geld des Spielers beinhalten soll

end;
Im Implementationsteil (in irgeneiner Routine):


Delphi-Quellcode:
var Spieler: TSpieler
begin
Spieler := TSpieler.create;
Spieler.Geld := 1000;
Spieler.free;
end;
So nun hat der Spieler innerhalb der Routine 1000 Geld. Aber von überall soll man Geld verwenden können z.B.:

Button1.Click:

Delphi-Quellcode:
var Wasgeldkostet: TSpieler;
begin
Wasgeldkostet := TSpieler.Create;

Label1.caption := InToSTR(Wasgeldkostet.Geld) //würde nichts ergeben!
end;
Nun möchte ich aber das wasgeldkostet auf das Spielergeld zugreift! Ich weis nicht wie ichs genauer erklären soll was ich meine....
Thomas Seidel
begin; 011010101101010100101010; end;
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Globale Variablen!

  Alt 6. Jul 2005, 19:27
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:
var Spieler: TSpieler
begin
  Spieler := TSpieler.create;
  Spieler.Geld := 1000;
  Spieler.free;
end;
zu
Delphi-Quellcode:
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 ist Spieler nicht Global und kann doch noch von überall genutzt werden.
Somit können auch andere Objekte über Form1.Spieler darauf zugreifen
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von tmode00
tmode00

Registriert seit: 21. Mai 2005
Ort: Gera
22 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Globale Variablen!

  Alt 6. Jul 2005, 19:48
Vielen vielen Dank, jetzt hab ich das prinzip verstanden Ich hab das nämlich nie ganz kapiert wie das gemeint ist mit den ,,Rahmenklassen" usw...

Ihr habt mir sehr geholfen!
Thomas Seidel
begin; 011010101101010100101010; end;
  Mit Zitat antworten Zitat
Benutzerbild von tmode00
tmode00

Registriert seit: 21. Mai 2005
Ort: Gera
22 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Globale Variablen!

  Alt 6. Jul 2005, 20:03
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 !
Thomas Seidel
begin; 011010101101010100101010; end;
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#9

Re: Globale Variablen!

  Alt 6. Jul 2005, 20:09
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;
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#10

Re: Globale Variablen!

  Alt 6. Jul 2005, 20:18
Hmm, was ist effektiv der Unterschied zwischen SirTs Lösung und einer globalen Vatriablen?...

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:
TSingletonMoneyDings.Instance.Money := 1
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:46 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