Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi case geht nich ?!? (https://www.delphipraxis.net/86193-case-geht-nich.html)

passsy 10. Feb 2007 18:20


case geht nich ?!?
 
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
 var i:integer;
 begin
 inc(i);
 case i of
 1:timer2.Enabled:=true;
 2:timer3.Enabled:=true;
 3:timer4.Enabled:=true;
 4:timer5.Enabled:=true;
 5:showmessage('test');
 6:timer1.Enabled:=false;
 end;
 
 end;
sieht ja ganz schön aus aber geht nich :( woran liegts?

MrKnogge 10. Feb 2007 18:21

Re: case geht nich ?!?
 
i hat am anfang einen unbestimmten Wert beispielsweise 767567576, du musst die variable initialisieren.

Gruß

Christian Seehase 10. Feb 2007 18:23

Re: case geht nich ?!?
 
Moin Pascal,

"geht nicht" hat ja nicht wirklich Aussagekraft, aber:

Du verwendest eine lokale Variable, die nicht einmal initialisiert wird, also einen Zufallswert enthält.
Initialsierung nutzt Dir aber auch nichts, da der Wert nach dem verlassen der Routine verworfen wird.
Du müsstest die also woanders unterbringen.

leddl 10. Feb 2007 18:26

Re: case geht nich ?!?
 
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
  var i:integer;
  begin
    inc(i);
    case i of
      1..4: timer5.Enabled:=true;
      5:   showmessage('test');
      6:   timer1.Enabled:=false;
    end;
  end;
end;
Hättest deinen Code etwas strukturiert, wäre dir das fehlende "end" sofort ins Auge gesprungen ;)

passsy 10. Feb 2007 18:28

Re: case geht nich ?!?
 
ah ok danke leute ich habs dann gelöst.

ich hab gedacht das n integer am anfang immer 0 is naja bin ja noch nich so lang dabei^^


das end hab ich nur vergessen rein zu kopieren^^

JasonDX 10. Feb 2007 18:30

Re: case geht nich ?!?
 
Zitat:

Zitat von leddl
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
  var i:integer;
  begin
    inc(i);
    case i of
      1..4: timer5.Enabled:=true;
      5:   showmessage('test');
      6:   timer1.Enabled:=false;
    end;
  end;
end;
Hättest deinen Code etwas strukturiert, wäre dir das fehlende "end" sofort ins Auge gesprungen ;)

Haettest du die Einrueckung nich so verplant, haettest du auch nicht solch *fieps* geschrieben :P :mrgreen:
:zwinker:

greetz
Mike

MrKnogge 10. Feb 2007 18:30

Re: case geht nich ?!?
 
leddl, schau dir deinen Code mal bitte genauer an, du hast ein end zuviel !

Gruß

leddl 10. Feb 2007 18:35

Re: case geht nich ?!?
 
:oops: Man sollte nach zuviel Java-Programmierung nich mal kurz zwischen Dusche und Essen ne Antwort zu ner Delphi-Frage schreiben :lol:

Christian Seehase 10. Feb 2007 22:28

Re: case geht nich ?!?
 
Moin Pascal,

Zitat:

Zitat von passsy
ich hab gedacht das n integer am anfang immer 0 is naja bin ja noch nich so lang dabei^^

das dem nicht so ist, weisst Du ja jetzt ;-)

Aber mit einer lokalen Variable kannst Du das Problem auch nicht lösen, wenn Du sie initialisierst...

xZise 10. Feb 2007 22:52

Re: case geht nich ?!?
 
Also passy, wenn du i zu anfang der Prozedur auf 0 setzt, dann kann ich dir für jeden Aufruf der Funktion vorraus sagen, dass er machen wird ... Und zwar immer "timer5.enabled := true"

@ leddl, aber was ist dann mit dem switch :P

passsy 11. Feb 2007 09:57

Re: case geht nich ?!?
 
ich hba jetzt einfach ne lokale variable gemacht musste ich zwar hochscrollen (kraftanstrengung) und mir nen vernünftigen namen überlegen (kreatives arbeiten) aber mit viel liebe zum deteil hat es dann geklappt^^

turboPASCAL 11. Feb 2007 10:19

Re: case geht nich ?!?
 
Zitat:

Zitat von passsy
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
 var i:integer;
 begin
 inc(i);
 case i of
 1:timer2.Enabled:=true;
 2:timer3.Enabled:=true;
 3:timer4.Enabled:=true;
 4:timer5.Enabled:=true;
 5:showmessage('test');
 6:timer1.Enabled:=false;
 end;
 
 end;
sieht ja ganz schön aus aber geht nich :( woran liegts?

"i" ist eine Lokale Variable die nur innerhalb der Procedure ober Funktion besteht.
Bei dem Aufruf der Procedure bzw einer Function ist/ wird der Inhalt der Variable gelöscht.
Setze die Variable "i" als Global.

Weiterhin wird dann bei jedem Aufruf "i" bis in das Uneldliche hochgezählt sodas dein Case bei
"i" grösser 6 keine Wirkung erzielt.

Delphi-Quellcode:
var
  MyCounter: Integer;

//oder mit Vorinitialisierung

var
  MyCounter: Integer = 0;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if MyCounter < 6 then inc(MyCounter) else MyCounter = 1;

  Case MyCounter of
    1: timer2.Enabled := TRUE;
    2: timer3.Enabled := TRUE;
    3: timer4.Enabled := TRUE;
    4: timer2.Enabled := FALSE;
    5: timer3.Enabled := FALSE;
    6: timer4.Enabled := FALSE;
  end; // End of Case
 
end; // End of Procedure Timer1

inherited 11. Feb 2007 10:28

Re: case geht nich ?!?
 
Zitat:

Zitat von turboPASCAL
Weiterhin wird dann bei jedem Aufruf "i" bis in das Uneldliche hochgezählt sodas dein Case bei
"i" grösser 6 keine Wirkung erzielt.

Falsch. Mit dem letzten switch wird Timer1.Enabled auf false gesetzt, somit wird eben diese Timerroutine nicht mehr aufgerufen.

thkerkmann 11. Feb 2007 10:52

Re: case geht nich ?!?
 
Hi,

ein
Delphi-Quellcode:
const i:integer = 0;
anstelle von
Delphi-Quellcode:
var i:integer;
in der Timerroutine hätte es auch getan.

Gruss

SirTwist 11. Feb 2007 11:05

Re: case geht nich ?!?
 
Zitat:

Zitat von thkerkmann
ein
Delphi-Quellcode:
const i:integer = 0;
in der Timerroutine hätte es auch getan.

Hast du schonmal versucht, eine Konstante zu erhöhen oder zu vermindern?

Mal ein Tip am Rande: So ein Timer hat ein Attribut "Tag", das man beliebig nutzen kann und vom Typ Integer ist... Na?

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Tag := (Timer1.Tag + 1) mod 6;
  case Timer1.Tag of
    1: ...
    2: ...
    3: ...
    4: ...
    5: ...
    0: Timer1.Enabled := False; // Trotz 0 wird es als letztes aufgerufen
  end;
end;

thkerkmann 11. Feb 2007 11:09

Re: case geht nich ?!?
 
Zitat:

Zitat von SirTwist
Hast du schonmal versucht, eine Konstante zu erhöhen oder zu vermindern?

Ja, hab ich - ich mach das öfter so. Anscheinend hast du es noch nicht versucht. Ab Delphi 5? gibt es beschreibbare Konstanten.

Gruss

passsy 11. Feb 2007 11:28

Re: case geht nich ?!?
 
leute ich weiß gar nich was ihr habt das problem is scho lang gelöst

himitsu 11. Feb 2007 11:49

Re: case geht nich ?!?
 
[oh]{$WRITEABLECONST ON}[/oh]

@thkerkmann: dem ist nicht unbedingt so.

3_of_8 11. Feb 2007 11:56

Re: case geht nich ?!?
 
Widerspricht das nicht irgendwie dem Sinn einer Konstante?

xZise 11. Feb 2007 11:57

Re: case geht nich ?!?
 
Zitat:

Zitat von 3_of_8
Widerspricht das nicht irgendwie dem Sinn einer Konstante?

Ej wollt ich auch sagen :P

Amn hätte nur dem Vorteil, des direkten Setzens der Variable...

3_of_8 11. Feb 2007 12:43

Re: case geht nich ?!?
 
Erinnert mich irgendwie an den alten Mathematikerwitz: "Sei epsilon kleiner 0." :lol:

Ich meinte, bei einer Konstante gehe ich davon aus, dass sie IMMER den gleichen Wert hat. Eine Konstante zu verändern ist meiner Meinung sinnlos.

inherited 11. Feb 2007 13:47

Re: case geht nich ?!?
 
Zitat:

Zitat von 3_of_8
...Eine Konstante zu verändern ist meiner Meinung sinnlos.

Und meiner Meinung nach auch sehr verwirrend. Wenn ich irgendwo lese "const sonstewas=diesunddas" erwarte ich, dass der Wert auch bleibt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:10 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-2025 by Thomas Breitkreuz