![]() |
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 |
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 |
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 |
Re: Endlosschleife mit Timer
Zitat:
MfG Binärbaum |
Re: Endlosschleife mit Timer
Ja stimmt. sorry.
also mein quelltext sieht ungefähr so aus:
Code:
das sind jetzt nur die ersten 3 das geht so weiter bis 30.
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; 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??? |
Re: Endlosschleife mit Timer
Zitat:
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:
So, fertig.
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; 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 |
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? |
Re: Endlosschleife mit Timer
Zitat:
|
Re: Endlosschleife mit Timer
Zitat:
Delphi-Quellcode:
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.
procedure PortOut(Port : Word; Data : Byte); stdcall; external 'io.dll';
Also ist es egal, welchen Wert man angibt. MfG Binärbaum |
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:
vielleicht sieht jetzt einer meinen fehler
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; danke |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:51 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