Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Varibleninhalt wird gelöscht (https://www.delphipraxis.net/81364-varibleninhalt-wird-geloescht.html)

Denny 25. Nov 2006 21:08


Varibleninhalt wird gelöscht
 
Hallo!

Ich habe folgendes Problem. Der Variableninhalt wird nach Abschluss jeder Prozedur automatisch gelöscht. Wie kann ich diese Variable auch in anderen Prozeduren nutzen, ohne dass der Inhalt gelöscht wird. Bei Visual Basic konnte man eine public Variable in einem Modul deklarieren. Wie funktioniert das bei Delphi?

Phoenix 25. Nov 2006 21:09

Re: Varibleninhalt wird gelöscht
 
Indem Du die Variable auf der zugehörigen Klasse deklarierst. z.B. in der Formularklasse im private, protected oder auch public bereich, je nachdem, von wo aus man auf die Variable zugreifen können muss.

Nils_13 25. Nov 2006 21:12

Re: Varibleninhalt wird gelöscht
 
Hi,

du hast jetzt warhscheinlich einen Code dieser Art:
Delphi-Quellcode:
procedure eins;
var i : Integer;
begin
  i := 0;
  inc(i);
  dec(i); // sinnlos, ist auch nur ein Beisipel
end;

procedure zwei;
begin
  machwas(i) // hier kracht es
end;
Oben im Private-Teil solltest du die Variable schreiben, wenn du mehrere Units benutzt, musst du das in den public-Teil schreiben und in der anderen Unit z.B. Form1.i.

Ich hoffe, ich habe dich richtig verstanden.


Arghs, roter Kasten, wo bist du ?

Denny 25. Nov 2006 21:25

Re: Varibleninhalt wird gelöscht
 
Das ist mein Code:

Delphi-Quellcode:
var
  Form1: TForm1;
  Richtung, RWeite: integer;
Delphi-Quellcode:
procedure TForm1.tmrBall2Timer(Sender: TObject);
begin
Randomize;
if Richtung = 0 then
  begin
    Richtung := Random(1);
    RWeite := Random(5);
  end;

Ball.Top := Ball.Top - 10;

if Richtung = 0 then
  Ball.Left := Ball.Left - Rweite
else
  Ball.Left := Ball.Left + Rweite;
end;
Wenn Richtung noch kein Wert zugewiesen wurde soll er den Variablen Richtung und RWeite Werte zuweisen. Wenn Richtung nicht 0 ist, also einen Wert hat, soll die if-Anweisung übersprungen werden und nur die Bewegung durchgeführt werden. Richtung und RWeite werden aber logischerweise nach einmaligem auführen gelöscht und der Ball fliegt eine Kurve, weil ihm dauernd neue Flugdaten gegeben werden.

Sharky 26. Nov 2006 08:36

Re: Varibleninhalt wird gelöscht
 
Hai Denny,

in deinem Code ist ein grundlegender Fehler.
Zitat:

Zitat von Denny
Das ist mein Code:
Delphi-Quellcode:
    Richtung := Random(1);

Das bedeutet das Richtung immer den Wert 0 haben wird. Random liefert einen Zufallswert im Bereich von 0 bis < Range zurück.
Wenn der Range 1 ist wird also immer eine Zufallszahl zwichen 0 und 0 erzeugt ;-)

BTW: Delphi-Referenz durchsuchenRandomize sollte nur einmal beim Programmstart (OnCreate der Form) aufgerufen werden.

Denny 26. Nov 2006 09:27

Re: Varibleninhalt wird gelöscht
 
Achso, danke! Wie könnte ich das dann schreiben, dass wenn der Ball an diesem gewissen Punkt ist eine Flugrichtung bekommt und dann in diese Richtung weiterfliegt, bis er wieder an dem nächsten Grenzpunkt ist. Mit Richtung wollte ich eigentlich eine 0 bzw. 1 erzeugen. 0 -> fliegt nach links, 1 -> fliegt nach rechts. RWeite ist der Winkel, in dem der Ball fliegt.

Sharky 26. Nov 2006 09:30

Re: Varibleninhalt wird gelöscht
 
Hai Denny,

ein Random(2) erzeugt eine Zufallszahl von 0 bis <2 also 0 bis 1 oder aus der Menge {0/1}.

Den Rest musst Du in deiner Programmlogik machen.

Denny 26. Nov 2006 09:34

Re: Varibleninhalt wird gelöscht
 
so! thx. nun bleibt noch mein hauptproblem. ich arbeite noch nicht lange mit deplphi, genauer gesagt, seit 3 wochen. wenn ich variablen als public deklarieren will, wo muss ich das genau hinschreiben? bitte mal auf idiotendeutsch erklären. :oops: :-D

Sharky 26. Nov 2006 09:43

Re: Varibleninhalt wird gelöscht
 
Hai Denny,

deklariere sie innerhalb deiner Klasse für das Formular.

Delphi-Quellcode:
  TDemo_Form = class(TForm)
    Button1: TButton;
    Ball: TImage;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    Richtung: Integer;
    RWeite: Integer;
  public
    { Public-Deklarationen }
  end;

Wenn Du das ganze dann noch eleganter machen möchtest würde ich für die Richtung ein Delphi-Referenz durchsuchenSet anlegen um mit aussagekräftigen Namen arbeiten zu können. Das könnte dann so aussehen:
Delphi-Quellcode:
unit U_Main;

interface

uses
  Windows, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type

  TRichtung = (links, rechts, undefiniert);

  TDemo_Form = class(TForm)
    Button1: TButton;
    Ball: TImage;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    Richtung: TRichtung;
    RWeite: Integer;
  public
    { Public-Deklarationen }
  end;

var
  Demo_Form: TDemo_Form;

implementation


{$R *.dfm}

procedure TDemo_Form.FormCreate(Sender: TObject);
begin
  Randomize;
  RWeite := 0;
  Richtung := undefiniert;
end;

procedure TDemo_Form.Button1Click(Sender: TObject);
begin
  if Richtung = undefiniert then
  begin
    Richtung := TRichtung(Random(2));
    RWeite  := Random(5);
  end;
  case Richtung of
    links: Ball.Left := Ball.Left - Rweite;
    rechts: Ball.Left := Ball.Left + Rweite;
  end;
  Ball.Top := Ball.Top - 10;
end;

Denny 26. Nov 2006 10:00

Re: Varibleninhalt wird gelöscht
 
Erstmal vielen Dank für deine Mühe. Ich habe vorerst die erste Variante genommen, weil ich die Zweite nicht gleich hinbekommen habe. Der Ball fliegt jedoch immernoch Kurven, weil im ständig neue Werte übermittelt Werten. :(

Delphi-Quellcode:
unit Tischtennis;

interface

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

type
  TForm1 = class(TForm)
    tmrBall: TTimer;
    tmrBall2: TTimer;
    Shape1: TShape;
    Wand: TShape;
    Shape5: TShape;
    Shape3: TShape;
    Shape4: TShape;
    Schlaeger: TShape;
    Shape2: TShape;
    Ball: TShape;
    procedure tmrBallTimer(Sender: TObject);
    procedure tmrBall2Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
      Richtung, RWeite: integer;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Tempo: integer;

implementation

{$R *.dfm}

procedure TForm1.tmrBallTimer(Sender: TObject);
begin
if Ball.Top + Ball.Height >= Schlaeger.Top then
  begin
    tmrBall.Enabled := false;
    tmrBall2.Enabled := true
  end
else
  Ball.Top := Ball.Top + Tempo;
end;

procedure TForm1.tmrBall2Timer(Sender: TObject);
begin
Randomize;
if Richtung = 0 then
  begin
    Richtung := Random(2);
    RWeite := Random(5);
  end;

Ball.Top := Ball.Top - Tempo;

if Ball.Top <= Wand.Top + Wand.Height then
  tmrBall2.Enabled := false
else
  if Richtung = 0 then
    ball.Left := ball.Left - Rweite
  else
    ball.Left := ball.Left + Rweite;
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Richtung := 0;
Rweite := 0;
Tempo := 20;
end;

end.


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

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