Delphi-PRAXiS

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.

Denny 26. Nov 2006 10:05

Re: Varibleninhalt wird gelöscht
 
Danke, ich habe den Fehler gefunden. Ich weise Richtung 0 oder 1 zu. Dann prüfe ich, ob es 0 ist. Es ist ja logisch, dass er dann irgendwann mal den Wert 0 annimmt. Jetzt ist der Startwert 3. Den kann er durch das Erzeugen nie bekommen. Jetzt funzt es:

Delphi-Quellcode:
if Richtung = 3 then
  begin
    Richtung := Random(2);
    RWeite := Random(5);
  end;
Diese kleinen Fehlerchen immer! :) DANKE!

Sharky 26. Nov 2006 10:08

Re: Varibleninhalt wird gelöscht
 
Zitat:

Zitat von Denny
.... Der Ball fliegt jedoch immernoch Kurven, weil im ständig neue Werte übermittelt Werten. ...

Hai Denny,

überlege einmal was passiert wenn TForm1.tmrBall2Timer aufgerufen wird und Richtung den Wert 1 hat.


Delphi-Quellcode:
procedure TForm1.tmrBall2Timer(Sender: TObject);
begin
 // Randomize;
  if Richtung = 0 then // Wird bei Richtung = 1 nie aufgerufen
  begin
    Richtung := Random(2);
    RWeite := Random(5);
  end;

  Ball.Top := Ball.Top - Tempo; // Der Ball fällt immer um "Tempo" Pixel nach unten

  if Richtung = 0 then
    ball.Left := ball.Left - Rweite
  else
    ball.Left := ball.Left + Rweite; // Der Ball wird um Rweite Pixel nach rechts bewegt
end;
Du hast also eine gleichzeitige Bewegung nach unten und nach rechts. Und das ist dann halt eine Kurve.

Denny 26. Nov 2006 10:13

Re: Varibleninhalt wird gelöscht
 
Jo, danke! Das habe ich dann auch bemerkt. Diese blöden, einfachen Fehler. :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:45 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