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 Grundfragen zur Listbox und Timer (https://www.delphipraxis.net/132644-grundfragen-zur-listbox-und-timer.html)

delphi-projekt 16. Apr 2009 17:09


Grundfragen zur Listbox und Timer
 
Im Voraus solltet ihr wissen das wir ein elektrisches Auto über den Computer steuern wollen.
Dazu müssen wir die einzelnen Checkboxen ansprechen damit der Computer weiß in welche Richtung das Auto fahren soll. Wir wollen das das Auto in einer vorgegebenen Zeit in eine bestimmte Richtung fährt dafür benötigen wir den Timer. Die Zeit und die Richtung in die das Auto fahren soll tragen wir in eine Stringgrid ein, in welcher der Timer die Werte ausliest.

1.Frage: Wir haben keine Ahnung was (stringgrid1.Row>stringgrid1.RowCount-2) then
stringgrid1.RowCount:=stringgrid1.Rowcount+1;
zu bedeuten hat

Delphi-Quellcode:
unit Unit4;
procedure TForm4.Button1Click(Sender: TObject);
var index:integer;
begin
Form1.cbStrobe.checked:=true;
if (stringgrid1.Row>stringgrid1.RowCount-2) then
stringgrid1.RowCount:=stringgrid1.Rowcount+1;
stringgrid1.Cells[0,stringgrid1.Row]:=(Edzeit.text);
stringgrid1.Cells[1,stringgrid1.Row]:=(ComboBox1.Text);
stringgrid1.Row:=stringgrid1.Row+1;
end;


2.Frage: Wieso müssen wir 2 Zeiten vereinbaren? ;zeitS:String; zeitI:integer
und daraus schlussfolgernd verstehen wir nicht
zeitS:=stringgrid1.Cells[0,Index];
zeitI:=Strtointdef(zeitS,0);


Delphi-Quellcode:
procedure TForm4.Button3Click(Sender: TObject);
var i,b,p:integer;
    g:string;
    zeitS:String;
    zeitI:integer;
begin
zeitS:=stringgrid1.Cells[0,Index];
zeitI:=Strtointdef(zeitS,0);
Timer1.Interval := 1000 * zeitI;
Timer1.Enabled:=True;
g:= stringgrid1.Cells[1,Index];
if g ='Geradeaus'
then
begin
Form1.cbStrobe.checked:=false;
Form1.cbData1.checked:=false;
Form1.cbData3.checked:=true;
Form1.cbData5.checked:=true;
Form1.cbData7.checked:=true;
end;
if g= 'Rückwärts'
then
begin
Form1.cbStrobe.checked:=false;
Form1.cbData3.checked:=false;
Form1.cbData1.checked:=true;
Form1.cbData5.checked:=true;
Form1.cbData7.checked:=true;
end;
if g= 'Geraderechts'
then
begin
Form1.cbStrobe.checked:=false;
Form1.cbData5.checked:=false;
Form1.cbData1.checked:=false;
Form1.cbData3.checked:=true;
Form1.cbData7.checked:=true;
end;
if g= 'Geradelinks'
then
begin
Form1.cbStrobe.checked:=false;
Form1.cbData7.checked:=false;
Form1.cbData1.checked:=false;
Form1.cbData3.checked:=true;
Form1.cbData5.checked:=true;
end;
3.Frage: Wir verstehen den euch vorliegenden Quelltext nicht, was hat dieser zu bedeuten?
Code:
Inc(Index);
If Index > stringgrid1.Row
then Index := 0;

if (Timer1.Interval<1) then
Timer1.Interval:=1;
end;

4.Frage: Wieso müssen wir die oben geschriebene Procedur nochmal komplett in den Timer einsetzen?

Code:
procedure TForm4.Timer1Timer(Sender: TObject);
var g:string;
    i,b,p:integer;
    zeitS:String;
    zeitI:integer;
begin
Form1.cbStrobe.checked:=false;
Form1.cbData1.checked:=false;
Form1.cbData3.checked:=false;
Form1.cbData5.checked:=false;
Form1.cbData7.checked:=false;
zeitS:=stringgrid1.Cells[0,Index];
zeitI:=Strtointdef(zeitS,0);
Timer1.Interval := 1000 * zeitI;
g:= stringgrid1.Cells[1,Index];
if g ='Geradeaus'
then
begin
Form1.cbStrobe.checked:=false;
Form1.cbData1.checked:=false;
Form1.cbData3.checked:=true;
Form1.cbData5.checked:=true;
Form1.cbData7.checked:=true;
end;
if g= 'Rückwärts'
then
begin
Form1.cbStrobe.checked:=false;
Form1.cbData1.checked:=true;
Form1.cbData3.checked:=false;
Form1.cbData5.checked:=true;
Form1.cbData7.checked:=true;
end;
if g= 'Geraderechts'
then
begin
Form1.cbStrobe.checked:=false;
Form1.cbData5.checked:=false;
Form1.cbData1.checked:=false;
Form1.cbData3.checked:=true;
Form1.cbData7.checked:=true;
end;
if g= 'Geradelinks'
then
begin
Form1.cbStrobe.checked:=false;
Form1.cbData7.checked:=false;
Form1.cbData1.checked:=false;
Form1.cbData3.checked:=true;
Form1.cbData5.checked:=true;
end;
Inc(Index);
If Index > stringgrid1.Row
then
begin
timer1.Enabled:=false;
Index := 0;
Form1.cbStrobe.checked:=True;
Form1.cbData1.checked:=false;
Form1.cbData3.checked:=false;
Form1.cbData5.checked:=false;
Form1.cbData7.checked:=false;
if (Timer1.Interval<1) then
Timer1.Interval:=1;end;
end;
Danke

oki 16. Apr 2009 19:26

Re: Grundfragen zur Listbox und Timer
 
hi delphi-projekt,

erst mal eins vorweg, teile deine Probleme auf mehrere Threads auf. Pro Frage ein Thread. Bemühe dich um eine ordentliche Formatierung deines Codes. Dann bekommst du sicher schneller deine Antwort.

Zitat:

1.Frage: Wir haben keine Ahnung was (stringgrid1.Row>stringgrid1.RowCount-2) then
stringgrid1.RowCount:=stringgrid1.Rowcount+1; zu bedeuten hat
ist die aktuell selektierte Zeile größer als die vorletzte Zeile, dann erhöhe die Anzahl der Zeilen des StringGrid um ein. Auf deutsch, ist die letzte Zeile selektiert, so hänge eine neue Zeile an das StringGrid ran.

Zitat:

2.Frage: Wieso müssen wir 2 Zeiten vereinbaren? ;zeitS:String; zeitI:integer
und daraus schlussfolgernd verstehen wir nicht
zeitS:=stringgrid1.Cells[0,Index];
zeitI:=Strtointdef(zeitS,0);
ZeitS ist der String der in der Zelle steht und ZeitI der Integer. Der Timer erwartet in Interval einen Integer. Ein StringGrid speichert aber nur Strings in seinen Zellen. Also wird zuerst der String gelesen und danach dieser in einen Integer gewandelt.
Es würde aber auch so gehen:
Delphi-Quellcode:
  ZeitI := StrtoIntDef(StringGrid1.Cells[0, Index], 0);
Dann spart man die Stringvariable.


Zitat:

3.Frage: Wir verstehen den euch vorliegenden Quelltext nicht, was hat dieser zu bedeuten?
Code: markieren
Inc(Index);
If Index > stringgrid1.Row
then Index := 0;

if (Timer1.Interval<1) then
Timer1.Interval:=1;
end;
Erster Teil:
Delphi-Quellcode:
  Inc(Index);                        // Index um einen Erhöhen (nächste Zeile)
  If Index > stringgrid1.Row then    // wenn letzte Zeile des StringGrid erreicht
    Index := 0;                      // dann mit Zeile 0 wieder anfangen

Zweiter Teil:
Delphi-Quellcode:
  if (Timer1.Interval<1) then
    Timer1.Interval:=1;
wird ein Intervall von 0 gesetzt, so soll dieser auf 1 gesetzt werden. Null Millisekunden bringt keinen Sinn. Ob eine Milisekunde was bringt ist die zweite Frage, aber wohl besser wie 0.

Nächste Frage später

Gruß oki

oki 16. Apr 2009 19:34

Re: Grundfragen zur Listbox und Timer
 
Zitat:

4.Frage: Wieso müssen wir die oben geschriebene Procedur nochmal komplett in den Timer einsetzen?
Müßt ihr nicht. Ich denke mal, dass über den Button unabhängig vom Timer um einen Schritt weiter gesetzt wird. So zu sagen Handbetrieb und Automatik (mit Timer).
Echt macht eher Sinn, den gesamten Teil in eine eigenen Procedure auszulagern. Bsp.:
Delphi-Quellcode:
procedure SteppIt;
var ....
begin
  ....
end;
Sowohl in der Ereignisbehandlungsmethode für den Button wie auch im Timer rufst du dann SteppIt auf.
Delphi-Quellcode:
procedure TForm4.Button3Click(Sender: TObject);
begin
  SteppIt;
end;

...

procedure TForm4.Timer1Timer(Sender: TObject);
begin
  SteppIt;
end;
Ein weiterer Vorteil ist, dass wenn du Änderungen im Ablauf vornimmst du es nur ein einer Stelle tun mußt. Du kannst nichts vergessen und alle Aufrufe funzen gleich.

Gruß oki


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