Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Endlosschleife mit Timer (https://www.delphipraxis.net/40513-endlosschleife-mit-timer.html)

Crazy-MF 16. Feb 2005 21:29


Endlosschleife mit Timer
 
Hallöchen,

war zwar lange nicht mehr da, hoffe aber das man mir trotzdem hilft.

Und zwar sende ich gerade über die TrackBar über den LPT1 an ein Gerät die Zahlen 1-30 im Hexadezimalen Zahlensystem.
Weil ich aber nicht den ganzen Tag vor meinem Notebook sitzen möchte um die TrackBar im Sekundentakt weiter zu schieben würde ich das gerne in einer Endlosschleife realisieren und dabei den Zeittakt in einem Feld bestimmen können.

Sollte dann in etwas so aussehen, dass ich ein Editfeld habe in dem ich den Takt eingebe und zwei Button einer zum starten der Endlosschleife und einen zum stoppen.


Wäre sehr nett wenn mir einer dabei helfen kann. Weiß nämlich nicht, ob ich das mit Delphi 5 überhaupt machen kann und wenn dann mit Timer oder einer anderen zeitgebenden Komponente.

Vielen Dank

Binärbaum 16. Feb 2005 21:34

Re: Endlosschleife mit Timer
 
Dann lese doch vor dem Start den Takt aus dem Edit-Feld aus und setze den Timer-Intervall dann auf diesen Wert. Durch den Klick auf den Start/Stop-Button wird Timer.Enabled auf True/False gesetzt und somit der Timer gestartet bzw. angehalten.

MfG
Binärbaum

Crazy-MF 16. Feb 2005 21:41

Re: Endlosschleife mit Timer
 
Tja das Problem bei der Sache ist dann nur noch:

Die Schleife wird bei dem Startbutton gestartet und nach dem der erste Hexwert gesendet ist soll er eine Pause einlegen, die ich im Editfeld eintrage, dann erst soll der nächste wert gesendet werden.
und der stoppbutton soll nur vorsorglich und zum ändern des taktes sein.

kann sein das ich das falsch erklärt habe.
danke aber für deinen tipp

Binärbaum 16. Feb 2005 22:08

Re: Endlosschleife mit Timer
 
Zitat:

Zitat von Crazy-MF
Tja das Problem bei der Sache ist dann nur noch:

Die Schleife wird bei dem Startbutton gestartet und nach dem der erste Hexwert gesendet ist soll er eine Pause einlegen, die ich im Editfeld eintrage, dann erst soll der nächste wert gesendet werden.
...

Aber genau das macht ein Timer doch: er führt die Aktion aus, die in der Ereignisprozedur OnTimer festgelegt ist und wartet danach den in der property Intervall festgelegten Zeitraum, bevor die Prozedur wieder ausgeführt wird.

MfG
Binärbaum

Crazy-MF 16. Feb 2005 22:25

Re: Endlosschleife mit Timer
 
Ja stimmt. sorry.

also mein quelltext sieht ungefähr so aus:

Code:
procedure PortOut(Port : Word; Data : Byte); stdcall; external 'io.dll';
function PortIn(Port : Word): Byte; stdcall; external 'io.dll';

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  If TrackBar1.Position = 0 then
    begin
      PortOut($378,$00);
    end;
  If TrackBar1.Position = 1 then
    begin
      PortOut($378,$01);
    end;
  If TrackBar1.Position = 2 then
    begin
      PortOut($378,$02);
    end;
das sind jetzt nur die ersten 3 das geht so weiter bis 30.
Wie soll ich denn jetzt genau mit der Timerkomponente eine schleife programmieren, damit er nach jedem mal wenn er den wert geändert hat zeit x wartet und dann den nächsten sendet???

Binärbaum 16. Feb 2005 22:41

Re: Endlosschleife mit Timer
 
Zitat:

Zitat von Crazy-MF
Ja stimmt. sorry.

also mein quelltext sieht ungefähr so aus:

Code:
procedure PortOut(Port : Word; Data : Byte); stdcall; external 'io.dll';
function PortIn(Port : Word): Byte; stdcall; external 'io.dll';

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  If TrackBar1.Position = 0 then
    begin
      PortOut($378,$00);
    end;
  If TrackBar1.Position = 1 then
    begin
      PortOut($378,$01);
    end;
  If TrackBar1.Position = 2 then
    begin
      PortOut($378,$02);
    end;
das sind jetzt nur die ersten 3 das geht so weiter bis 30.
Wie soll ich denn jetzt genau mit der Timerkomponente eine schleife programmieren, damit er nach jedem mal wenn er den wert geändert hat zeit x wartet und dann den nächsten sendet???

Hast wohl was gegen die Timer? Dann hier eine Lösung ohne Timer:
Also setze auf deine Form ein Edit (für die Verzögerungszeit), zwei Buttons (1. zum starten, 2. zum stoppen) und die TrackBar.
Dann noch folgender Code:
Delphi-Quellcode:
procedure Warten(ms: Cardinal);
var zeit: Cardinal;
begin
 zeit:= GetTickCount;
 while ((GetTickCount-zeit)<ms) do
  Application.ProcessMessages;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Schleife:= True;
 Senden;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 Schleife:= False;
end;

procedure Senden;
var i: Integer;
    delay: Cardinal;//Verzögerung in Millisekunden
begin
 try
  delay:= StrToInt(Form1.Edit1.Text);
 except
  delay:= 1000;
 end;
 i:=0;
 while (Schleife and (i<=30)) do begin
  i:= i+1;
  PortOut($378,i);
  Warten(delay);
 end;
 Schleife:= False;
end;
So, fertig.
Statt in der Prozedur senden die Variable i hochzuzählen, kannst du auch die TrackBar.Position erhöhen und dann diese senden.
Die Variable Schleife ist von Typ Boolean und global deklariert. Sie sollte im OnCreate-Ereignis der Form1 auf False gesetzt werden (ist aber nicht unbedingt nötig).

MfG
Binärbaum

//Edit: kleinen Fehler im Quelltext berichtigt

Crazy-MF 17. Feb 2005 08:17

Re: Endlosschleife mit Timer
 
Ja danke, das klappt soweit. Aber ich muss die Werte in Hex an den Port senden und er zählt jetzt dezimal hoch.

WAS TUN?

bis Port($378,09) kommt er ja aber dann müsste er ja anders senden?

TeronG 17. Feb 2005 11:31

Re: Endlosschleife mit Timer
 
Zitat:

Zitat von Crazy-MF

Wie soll ich denn jetzt genau mit der Timerkomponente eine schleife programmieren, damit ...

Wieso Schleife im Timer progammieren .. der Timer an sich ist ja schon eine art Endlosschleife ... nur, daß sie nicht nach ende der Procedure sonder nach einem bestimmten Intervall neu gestartet wird ... :gruebel:

Binärbaum 17. Feb 2005 13:20

Re: Endlosschleife mit Timer
 
Zitat:

Zitat von Crazy-MF
Ja danke, das klappt soweit. Aber ich muss die Werte in Hex an den Port senden und er zählt jetzt dezimal hoch.

WAS TUN?

bis Port($378,09) kommt er ja aber dann müsste er ja anders senden?

Also die Prozedurdeklaration ist doch folgende:
Delphi-Quellcode:
procedure PortOut(Port : Word; Data : Byte); stdcall; external 'io.dll';
Das heißt, es wird ein Wert vom Typ Byte an den ausgewählten Port gesendet. Ob man den Wert nun dezimal oder als den entsprechenden Hex-Wert angibt, dürfte ziemlich egal sein. Letztlich ist das sowieso alles binär codiert, also wird sowohl aus der 10 im Dezimalsystem oder $A im Hexadezimalsystem der gleiche Binärcode: 1010.
Also ist es egal, welchen Wert man angibt.

MfG
Binärbaum

Crazy-MF 17. Feb 2005 14:14

Re: Endlosschleife mit Timer
 
okay okay. jetz funzt es.
ich habe meine oberfläche mit dem editfeld und 2 button
ich gebe meinen intervall an und drücke button1 und er läuft los. sendet brav über lpt1 die daten und nach jedem datenabschnitt unterbricht er für zeit x. aber endlos läuft er nicht. er bleibt nach 30 stehen und fängt nicht wieder von 0 an. wenn ich das aber alles in eine schleife setze und diese auf unedlich laufen lasse kackt alles ab.

hier mal der code:

Delphi-Quellcode:
procedure PortOut(Port : Word; Data : Byte); stdcall; external 'io.dll';
function PortIn(Port : Word): Byte; stdcall; external 'io.dll';

procedure Warten(ms: Cardinal);
var zeit: Cardinal;
begin
  zeit := GetTickCount;
  while ((GetTickCount-zeit)<ms) do
    Application.ProcessMessages;
end;

procedure Senden;
var    i: Integer;
    delay: Cardinal; //Verzögerung in Millisekunden
begin
  try
    delay := StrToInt(Form1.Edit1.Text);
  except
  delay := 1000;
end;

Form1.ProgressBar1.Position := 0;
i := 0;
  while (Schleife and (i<30)) do
  begin
    i:= i+1;
    PortOut($378,i);
    Warten(delay);
    Form1.ProgressBar1.Position := Form1.ProgressBar1.Position +1;
  end;
  Schleife := False;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Schleife := False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Schleife := True;
  Senden;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Schleife := False;
end;
vielleicht sieht jetzt einer meinen fehler

danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:49 Uhr.
Seite 1 von 2  1 2      

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