Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Variabeln Problem! (https://www.delphipraxis.net/53651-variabeln-problem.html)

Zwock 20. Sep 2005 18:36


Variabeln Problem!
 
Hallo Leute!
Also, ich habe folgendes Problem:

Ich möchte, dass mein Programm, das aus einem Button und 3 Kreisen(Shapes die die Farbe wechseln sollen) besteht, immer wenn man auf den Button klickt ,1 zur Variable "VRunde" hinzurechnet.
Desweiteren soll bei einem Klick auf den Button der Wert der "VRunde" überprüft werden, und wenn er 0,1,2,3 o.4 entspricht sollen je andere Dinge ausgeführt werden.

Meine Fragen sind nun:

-Wie weise ich der der Variable "VRunde", die ich im "var" Bereich als Integer bestimmt habe, einen Wert zu? Dieser Wert muss ausserhalb der Onclick Procedure stehen!

- Wenn ich die Variable vergleichen will:

Delphi-Quellcode:
 if Vrunde := 1 
then (...)
Wird mir angezeigt, dass ein Bolean Ausdruck in dieser Zeile erwartet wurde. Wie kann ich dieses Problem lösen? (Ja ich habe 2 Tutorials dazu gelesen, es aber nicht verstanden)

Und wie kann ich es schaffen, dass die Variable "VRunde" sobald sie den Wert 4 erreicht hat, wieder auf 0 gesetzt wird?

Vielen Dank im Voraus! (Bin mir nicht sicher ob es das richtige Forum war, wenn nicht dann sorry!)

idontwantaname 20. Sep 2005 18:51

Re: Variabeln Problem!
 
Code:
if Vrunde = 1
then
um werte zu vergleichen, muss man ein = statt := verwenden

DP-Maintenance 20. Sep 2005 18:54

DP-Maintenance
 
Dieses Thema wurde von "Sharky" von "Tutorials und Kurse" nach "Object-Pascal / Delphi-Language" verschoben.
In der Tutorialsparte bitte keine Fragen posten.
Danke :-D

faux 20. Sep 2005 18:59

Re: Variabeln Problem!
 
Hallo!

Du solltest die Variable nicht in der procedure sondern in der Klasse deklarieren. Also einfach oben bei der Form nach private schreiben (im Interface):

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure Paint(Sender: TObject);
  private
    //*** HIER DIE VARIABLE DEKLARIEREN ***//
    Vrunde: Integer;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
Dann ist sie "immer" verfügbar.

Die Ereignisse kannst du mit einer If-Then-Else - Abfrage machen. Einfacher ginge es mit case.

Bsp:

Delphi-Quellcode:
if Vrunde = 0 then
  Aktion
else if Vrunde = 1 then
  Aktion
else if Vrunde = 2 then
  Aktion
else if Vrunde = 3 then
begin
  Aktionen;
end
else if Vrunde = 4 then
begin
  Aktionen;
  Vrunde := 0;
end;
mit Case:

Delphi-Quellcode:
case Vrunde of
  0:
      Aktion;
  1:
      Aktion;
  2:
      Aktion;
  3: begin
        Aktionen;
      end;
  4: begin
        Aktionen;
        Vrunde := 0;
     end;
end;
Grüße
Faux

Khabarakh 20. Sep 2005 19:03

Re: Variabeln Problem!
 
Zitat:

Zitat von Zwock
Und wie kann ich es schaffen, dass die Variable "VRunde" sobald sie den Wert 4 erreicht hat, wieder auf 0 gesetzt wird?

Entweder
Delphi-Quellcode:
Inc(VRunde);
if VRunde = 4 then
  VRunde := 0;
oder (IMO "schöner"):
Delphi-Quellcode:
VRunde := (VRunde + 1) mod 4;

Zwock 20. Sep 2005 20:22

Re: Variabeln Problem!
 
Danke schonmal für die kompetente Hilfe!
Ihr seid echt klasse, das muss mal gesagt werden.

Nun habe ich aber ein Problem:

Ich kann ja den Typ der Variable unter "var" deklarieren. Nur den WERT der Variable, der 0 entsprechen soll, wo und wie deklariere ich den? Ich habe nun folgendes gemacht:

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    SRot: TShape;
    SGruen: TShape;
    SGelb: TShape;
    BSchalten: TButton;
    procedure BSchaltenClick(Sender: TObject);
  private
    VSchalten:= 0;
  public
    { Public-Deklarationen }
  end;

  var
  Form1: TForm1;
  VSchalten: Integer;



implementation

{$R *.dfm}
Ich bekomme als Fehlermeldung aber:

Zitat:

[Fehler] Unit1.pas(18): ',' oder ':' erwartet, aber ':=' gefunden

malo 20. Sep 2005 20:27

Re: Variabeln Problem!
 
Du kannst der Variablen in dem Abschnitt keinen Wert zuweisen. Nur einen Typen. Also so:

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    SRot: TShape;
    SGruen: TShape;
    SGelb: TShape;
    BSchalten: TButton;
    procedure BSchaltenClick(Sender: TObject);
  private
    VSchalten: integer;
  public
    { Public-Deklarationen }
  end;

  var
  Form1: TForm1;
  //VSchalten: Integer; <-- da nicht mehr



implementation

{$R *.dfm}
Und später, in einem Aufruf (z.B. OnCreate-Ereignis (Objektinspektor)) auf 0 setzen.

edit: Aus dem Var-Abschnitt muss das raus. Du solltest die Variable aus dem var-Abschnitt in den private-Abschnitt verlegen.

Sharky 20. Sep 2005 20:28

Re: Variabeln Problem!
 
Hai Zwocke,

malo hat es ja schon beschrieben. Ich würde das ganze dann so mache:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    VSchalten: integer;
    procedure FormInit;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FormInit;
end;

procedure TForm1.FormInit;
begin
  VSchalten:= 0;
end;

faux 20. Sep 2005 20:29

Re: Variabeln Problem!
 
Als Deklarieren bezeichnet man das definieren einer Variable. Also man legt fest, welchen Dateityp sie bekommt. Was du willst, ist ihr ein Wert zuweisen. Aber bevor du ihr einen Wert zuweisen kannst, solltest du sie vorher Deklarieren, damit Delphi auch weiß, ob das jetzt ein Integer, ein Real, oder was auch immer ist.
Also:

Delphi-Quellcode:
...
private
  VSchalten: Integer;
...
Erst jetzt kannst du ihr einen Wert zuweisen, jedoch musst du das in einer Prozedur oder Funktion machen. Also zB im OnCreate...

Das geht dann mit:
Delphi-Quellcode:
VSchalten := 0;
Grüße
Faux

Tipp: http://www.dsdt.info/grundlagen/

malo 20. Sep 2005 20:30

Re: Variabeln Problem!
 
Noch ein Nachtrag: www.dsdt.info/grundlagen oder www.dsdt.info/tutorials

Ersteres ist zum Lernen leichter, allerdings imho sehr viel Theorie. Nach den ersten Seiten der Grundlagen kannst du auch mal das eine oder andere Tutorial anschauen (Einsteigertutorials) ;)

edit: :wall: Da hab ich glatt den Link im obigen Post überlesen :roll:

faux 20. Sep 2005 20:31

Re: Variabeln Problem!
 
Zitat:

Zitat von malo
allerdings imho sehr viel Theorie.

Äähmmm... Wie willst du sonst jemanden erklären, wie man Variablen Deklariert, etc? :roll:

malo 20. Sep 2005 20:34

Re: Variabeln Problem!
 
Zitat:

Zitat von faux
Zitat:

Zitat von malo
allerdings imho sehr viel Theorie.

Äähmmm... Wie willst du sonst jemanden erklären, wie man Variablen Deklariert, etc? :roll:

Naja, in einem Tutorial lernt man das imho schöner an einem praktischen Beispiel. Jedenfalls meistens... manche Dinge müssen allerdings theoretisch durchgenommen werden, aber die Grundlagen gehen nach einiger Zeit doch schon etwas tiefer, und da könnte man sich das Wissen ein wenig geschickter (imho) durch praktische Beispiele aneignen, bzw. besser einprägen. Reine Theorie ist halt auch nicht schön :?

Zwock 20. Sep 2005 20:39

Re: Variabeln Problem!
 
O.k! Habe das soweit verstanden, werde mich auch mit der empfohlenen "Lektüre" beschäftigen.
Nun, da das Programm läuft, ist mir jedoch aufgefallen, dass ich einen grundlegenden Denkfehler gemacht haben muss.

Ich erkläre schnell die Aufgabenstellung:

Wir sollten mit Shapes 3 Kreise machen, die als Ampel fungieren. Daneben >EIN< Button, der das Umschalten der Ampel steuert. Also wenn man das erste Mal klickt soll sie Rot werden, beim Zweiten mal dann Rot + Gelb, dann Grün, schließlich Gelb und zuletzt wieder Rot. Pro Klick soll die Änderung auftreten.

Mein Gedankengang: Ich lasse Pro Klick die Variable VSchalten um 1 Steigen, bei 0 wird Rot angezeigt, bei 1 Rot+Gelb, bei 2 dann Grün, bei 3 soll nur Gelb angezeigt werden, und schliesslich soll die Variable wieder auf 0 gesetzt werden, sie würde dann wieder Rot erscheinen und alles würde von vorne beginnen. Hier mein Code:

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    SRot: TShape;
    SGruen: TShape;
    SGelb: TShape;
    BSchalten: TButton;
    procedure BSchaltenClick(Sender: TObject);
  private
    VSchalten: integer;
  public
    { Public-Deklarationen }
  end;

  var
  Form1: TForm1;


implementation

{$R *.dfm}



procedure TForm1.BSchaltenClick(Sender: TObject);


 begin
 VSchalten:= 0;
 inc(VSchalten);

  if VSchalten= 0 then
   begin
    SRot.Brush.Color := clred;
    SGelb.Brush.Color := clblack;
    SGruen.Brush.Color := clblack;
   end

  else if VSchalten= 1 then
   begin
    SRot.Brush.Color := clred;
    SGelb.Brush.Color := clyellow;
    SGruen.Brush.Color := clblack;
   end

 else if VSchalten= 2 then
  begin
   SRot.Brush.Color:= clblack;
   SGelb.Brush.Color:= clblack;
   SGruen.Brush.Color:= clgreen;
  end

  else if VSchalten= 3 then
   begin
    SRot.Brush.Color:= clblack;
    SGelb.Brush.Color:= clyellow;
    SGruen.Brush.Color:= clblack;
   end

   else if VSchalten= 4 then
    VSchalten := 0;
end;

end.
Jedoch zeigt er mir beim ersten klick Rot, dann blitzschnell RotGelb an, und bei weiteren Klicks geschieht garnichtsmehr... Vielleicht ist es ein bisschen sehr viel verlangt, aber kann mir da jemand weiterhelfeb?

Sharky 20. Sep 2005 20:49

Re: Variabeln Problem!
 
Hai Zwock,

zum einen: Die ganzen else im Code brauchst Du nicht. Dann: Du darfst deine Variable in dem OnClick des Buttons nich immer auf 0 setzen! Sonst kann sie ja nie über den Wert 1 kommen. Und zu guter letzt: Setze die Abfrage ob die Variable den Wert 4 hat ganz an den Anfang (unter das INC(VSchalten)).

[Edit]Sorry, das mit dem "es fehlt ein End; war für etwas anderes als diesen Thread bestimmt :oops:

faux 20. Sep 2005 20:49

Re: Variabeln Problem!
 
Bist du dir bewusst, dass wenn die Variable 4 ist, du zwei Klickst brauchst, bis du eine Verändernung sehen kannst?
Denn erst wird sie auf 0 gesetzt, und erst beim nächsten Klick, wird dann die Aktion durchgeführt.

Du solltest nicht mit if vschlaten = 0 sondern mit = 1 beginnen, da du ja den Wert 0 mit inc() auf 1 erhöhst.

Zwock 20. Sep 2005 20:52

Re: Variabeln Problem!
 
JA!
Genau das meinte ich ja vorhind mit dem "Sie darf nicht in der Onclick Procedure stehen", direkt in meinem ersten Post, denn genau davon ging ich aus. Nur wo soll ich die Definiton stattdessen hinsetzen?

faux 20. Sep 2005 20:54

Re: Variabeln Problem!
 
Zitat:

Zitat von Zwock
JA!
Genau das meinte ich ja vorhind mit dem "Sie darf nicht in der Onclick Procedure stehen", direkt in meinem ersten Post, denn genau davon ging ich aus. Nur wo soll ich die Definiton stattdessen hinsetzen?

Ins OnCreate (Doppelklick in die Form). Das wird aufgerufen, wenn die Form erzeugt wird.

Sharky 20. Sep 2005 20:54

Re: Variabeln Problem!
 
Hai Zwock.

Immer schön alle Antworten lesen die Du bekommst! ;-)

Zwock 20. Sep 2005 21:00

Re: Variabeln Problem!
 
Vielen Dank!
Ich habs endlich auf die Reihe bekommen!
Ich werd mich direkt mit der empfohlenen Lektüre beschäftigen, um euch nicht weiter mit solchen Anfänger-Fragen belästigen zu müssen :D

EDIT:

Und ich habe das Problem mit dem 2x Klicken, um die Ampel wieder auf Rot zu stellen in den Griff bekommen. Anstatt die Variable nach erreichen des Wertes von 5 zurückzusetzen, setze ich sie nun einfach direkt zurück nachdem sie den Wert 4 erreicht hat, also in der Else-If Schleife von Gelb. (1=rot, 2= rot + gelb, 3=grün, 4=gelb + zurücksetzen der Variable)

faux 20. Sep 2005 21:10

Re: Variabeln Problem!
 
An deiner Stelle, würde ich das mit den Ampeln lieber sein lassen, das artet nur in Arbeit aus... :mrgreen:
Ich hab auch sowas "nur aus Spass" gemacht. Daraus ist ein Programm geworden, dass vom Benutzer eingestellte Ampelreihen abarbeitet und anzeigen kann. Mit Zeit-Leiste, etc... :lol:

Sharky 20. Sep 2005 21:19

Re: Variabeln Problem!
 
Zitat:

Zitat von Zwock
... euch nicht weiter mit solchen Anfänger-Fragen belästigen zu müssen

Keiner hat hier etwas gegen Anfänger-Fragen! (naja, einige schon. Aber auf die achten wir nicht *g*)

Zitat:

in den Griff bekommen.
Das ist fein.
Ich hätte das jetzt auf die schnelle so gemacht:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    btn_Schalten: TButton;
    SRot: TShape;
    SGelb: TShape;
    SGruen: TShape;
    procedure FormCreate(Sender: TObject);
    procedure btn_SchaltenClick(Sender: TObject);
  private
    { Private-Deklarationen }
    VSchalten: integer;
    procedure FormInit;
    procedure UpDateAmpel;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn_SchaltenClick(Sender: TObject);
begin
  Inc(VSchalten);
  UpDateAmpel;
end;

procedure TForm1.FormInit;
begin
  VSchalten := 0;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FormInit;
  UpDateAmpel;
end;

procedure TForm1.UpDateAmpel;
begin
  if (VSchalten = 4) then
  begin
    VSchalten := 0;
  end;
  case VSchalten of
    0:
    begin
      SRot.Brush.Color := clred;
      SGelb.Brush.Color := clblack;
      SGruen.Brush.Color := clblack;
    end;
    1:
    begin
      SRot.Brush.Color := clred;
      SGelb.Brush.Color := clyellow;
      SGruen.Brush.Color := clblack;
    end;
    2:
    begin
      SRot.Brush.Color := clblack;
      SGelb.Brush.Color := clblack;
      SGruen.Brush.Color := clgreen;
    end;
    3:
    begin
      SRot.Brush.Color := clblack;
      SGelb.Brush.Color := clyellow;
      SGruen.Brush.Color := clblack;
    end;
  end;
end;

malo 21. Sep 2005 06:50

Re: Variabeln Problem!
 
Zitat:

Zitat von Sharky
zum einen: Die ganzen else im Code brauchst Du nicht.

Nunja, theoretisch bringen diese else's ja einen Geschwindigkeitszuwachs (immerhin wird die Abfrage nur gestartet, wenn das nicht zutrifft). Praktisch gesehen ist es eh egal, da kann man nichtmal bei einem alten C64 einen Unterschied feststellen, denke ich :mrgreen:

Wobei das mit dem Case auch wieder besser ist ;)
Klugscheißen Ende...

Zwock 21. Sep 2005 15:32

Re: Variabeln Problem!
 
Nunja, ich mache das nicht aus "Spaß" sondern, weil mein Lehrer mir das so aufgetragen hat. Und da kann es mir egal sein, warum er das verlangt, Tatsache ist dass er es in der nächsten Stunde sehen will ;) *gogo Info LK*. Hab eigentlich mit der Theorie weniger Probleme, nur ist Delphi doch in manchen Sachen anders als ich es bisher von zB PHP kannte ;)


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