eXma » Diskutieren » Computer und Technik
Startseite - Veranstaltungen - Mitglieder - Suche
Vollständige Version anzeigen: Globale Variablen bei Delphi
_joschi_
Bevor ich hier mit der Schilderung meines Problems beginne, möchte ich höflichst darauf hinweisen, dass ich ein zartes Gemüt besitze.
Aus diesem Grunde bitte ich euch, mich nicht aufgrund der von mir verwendeten Programmiersprache auszulachen und auszubuhen weeping.gif
Es handelt sich um Delphi 6 *duck*
Na ja, schien mir an geeignetsten für mein Vorhaben: Die Programmierung eines kurzweiligen Eroberungsspiel. Und so.
Nach stundenlanger Vorbereitung und Skizzierung des Programmablaufs fing ich mit der Programmierung an.
Meine Idee war, das Spiel in Runden zu gestalten, wobei jede Runde für ein Jahr steht. Das Jahr ist in "9 Forms" unterteilt, d.h. z.b. in Form 3 wird die Steuerhöhe bestimmt, dann schliesst sich Form 3 und Form 4 öffnet sich, in dem es um das Miliär geht usw...
Schliesst man jedoch ein Form(ular), werden die Variablen nicht in das nächste Form(ular) übernommen, was ziemlich doof ist, da zum Beispiel Geld in jedem Formular benötigt wird.
Und Lust jede Variable in einer Textdatei zu speichern hab ich auch nicht, zuviel Schreibkram.
Also muss ich globale Variablen benutzen, hab ich auch versucht, nur funzt der Mist nicht so wie ich will.
Also ich will folgendes: In Form 1 (Unit 1) eine globale Variable deklarieren, und sie mit einem Wert belegen.
Anschliessend will ich Form 1 schliessen, Form 2 (Unit 2) öffnen, und es soll mir in diesem Form 2 die implementierte globale Variable aus Form 1 anzeigen. Klingt an sich simpel, aber es will einfach nicht funktionieren!!!!

Danke für die Hilfe.

//edit: Wer mir bei der Lösung meines Problems hilft, bekommt das irgendwann fertige Spiel statt für 49.99 Euro im Saturn umsonst rofl.gif
SidKennedy
ähm das klingt sehr danach, als wärst du gerade dabei die GUI und die Logik in ein und dieselben klassen zu hauen. klar kannst du das machen, aber is sehr doof. schwer zu warten und generell unübersichtlich. trenne beides und du wirst sehen, wenn du zum beispiel ein objekt "Konto" hast, kannst du das beliebig in jeder Form auslesen, und deren Methoden anwenden. delphi(object pascal) is halt schon nen bissel mehr als pascal was man aus der schule kennt wink.gif
stth
jap... kann ich mich nur anschließen...
yocheckit
hast du das in der form:
CODE
unit name;
interface
uses
 blabla;
type
 TForm1 = class(TForm)
    blabla;
 private
    bla
 public
    bla
 end;
var
 Form1: TForm1;
 [COLOR=red]name: typ = konstante/variable;[/COLOR]
implementation

das rot gekennzeichnete kann je nach fall auch ohne "= konstante/variable" stehen. wichtig ist nur, dass die definition der globalen variablen genau an dieser stelle geschieht. ich wüsste nicht warum es sonst nicht gehen sollte.

/edit: farbe geht leider nicht bei code, aber man sieht ja wo ich die farb-tags gesetzt hab.
tingel
Es kommt darauf an, wo du die Variablen deklarierst, interface=global, implementation=nur in der Unit sichtbar.
Wie schon angedeutet, solltest du aber globale Variablen weitestgehend vermeiden und das Modell des Spiels als Klassenstruktur abbilden. Die Objekte manipulierst du dann über deine Formulare.

interface

var
global:TMyGame;

implementation

var
lokal:TMyMoney;
_joschi_
Yocheckit und tingel, wo ich die Variablen deklarieren muss, ist mir klar. Nur wird die Variable komischerweise in einem anderen Unit nicht benutzt. Ich hab mal gegoogelt, und da stand irgendwas von "unit einbinden". Hab ich getan,aber hm...

Folgender Aufbau: Ich hab ein Formular 1 , auf dem sich ein Editfeld 1 befindet, in das ich meinen Namen eingebe. Klicke ich nun auf Button 1, so wird das Editfeld 1 in der Variable "name" gespeichert und es schliesst Formular 1.
Formular 2 öffnet sich. Jetzt müsste theoretisch die Variable "name" in Label 1 auf Formular 2 geschrieben werden. Tut es aber nicht. Ich wette, es ist ein saudummer Fehler, und wenn ich drauf komme, fällt es mir wie Schuppen von den Augen und ich erschiesse mich am nächsten Baum.


Hier die Unit1

Zitat
unit Unit1;

interface

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

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

var
  Form1: TForm1;
  name: string;      // globale String-Variable

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
      name := edit1.text;  // Variable wird ein Wert zugewiesen

      form1.Hide;
      form2.show;
end;

end.





Und hier Unit2

Zitat
unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    Label1: TLabel;
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormShow(Sender: TObject);
begin
            label1.Caption := name;  // Label1 aus Form2 soll in Unit1 deklarierte globale Variable anzeigen
end;

end.




Wo ist der Fehler?

Tingel, natürlich könnte ich die Objekte in ein Formular packen und über die Units manipulieren, aber das ist immenser Schreibkram,und darauf hab ich keine Lust wacko.gif
yocheckit
die unit2 gehört mit in den uses-bereich der unit1 also unter uses einfach noch unit2 eintragen. weiß aber nicht, ob das der einzige fehler ist und kann es auch nicht überprüfen, da ich kein delphi mehr auf dem rechner hab.
tingel
Zitat(Bilderguckn @ 19 Apr 2007, 19:17)
Tingel, natürlich könnte ich die Objekte in ein Formular packen und über die Units manipulieren, aber das ist immenser Schreibkram,und darauf hab ich keine Lust  wacko.gif

Machst du das Ganze, um Programmieren zu lernen? Dann wäre deine Herangehensweise lediglich dazu geeignet, zu lernen, daß sowas ganz schnell unübersichtlich und nervig wird. Darüber hinaus wird sich dein Programm schnell "funky" verhalten.
Schon dein Kommentar, die Objekte in ein Formular zu packen verrät die Denkweise, die dahinter steckt wink.gif Google mal nach Model View Controller, da wirst du so einiges finden und mußt nicht alles auf die harte Tour lernen.
_joschi_
Zitat(tingel @ 19 Apr 2007, 20:24)
Machst du das Ganze, um Programmieren zu lernen? Dann wäre deine Herangehensweise lediglich dazu geeignet, zu lernen, daß sowas ganz schnell unübersichtlich und nervig wird. Darüber hinaus wird sich dein Programm schnell "funky" verhalten.
Schon dein Kommentar, die Objekte in ein Formular zu packen verrät die Denkweise, die dahinter steckt wink.gif Google mal nach Model View Controller, da wirst du so einiges finden und mußt nicht alles auf die harte Tour lernen.
*


Ich meinte nicht,alles in EIN Formular packen, sondern eher alles in viele Formulare packen. Und Programmieren lernen will ich auch nicht, sondern nur mit meinen begrenzten Fähigkeiten ein Spiel basteln. Und alles was ich wissen wollte, ist wie ich eine Variable aus Unit1 auch in Unit2 benutzen kann sad.gif Ob das unübersichtlich oder "funky" ist, bleibt mein Problem. Noch vor 4-5 Jahren hab ich Delphi ganz gut beherrscht, allerdings hab ich es erst neulich wieder hervorgekramt und dabei leider festgestellt, dass ich viel vergessen und verlernt hab sleeping.gif
hopi
zur lösung des problems:
verwende einfach anstelle der bezeichnung 'name' für den globalen string eine andere bezeichnung, z.b. name1 (zum testen). "name" ist doch die standardeigenschaft für die bezeichnung von komponenten und dadurch als bezeichnung für eine variable denkbar ungeeignet, da sonst unter umständen die eigenschaft "name" einer komponente überschrieben wird.
außerdem muss unit1 auch in unit2 eingebunden sein.