![]() |
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? |
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.
|
Re: Varibleninhalt wird gelöscht
Hi,
du hast jetzt warhscheinlich einen Code dieser Art:
Delphi-Quellcode:
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.
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; Ich hoffe, ich habe dich richtig verstanden. Arghs, roter Kasten, wo bist du ? |
Re: Varibleninhalt wird gelöscht
Das ist mein Code:
Delphi-Quellcode:
var
Form1: TForm1; Richtung, RWeite: integer;
Delphi-Quellcode:
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.
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; |
Re: Varibleninhalt wird gelöscht
Hai Denny,
in deinem Code ist ein grundlegender Fehler. Zitat:
Wenn der Range 1 ist wird also immer eine Zufallszahl zwichen 0 und 0 erzeugt ;-) BTW: ![]() |
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.
|
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. |
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
|
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-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; |
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. |
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