![]() |
Tastatureingabe abfragen innerhalb einer Schleife
Ich möchte eine Zeitverlauf eines Signals anzeigen,
das ich während des Darstellung durch Tastatureingabe bzw Click auf verschiedene Buttons verändern kann. Zur Veranschaulichung hier der Programm Code. Bitte nicht über das Programm herfallen, ich bin noch etwas unerfahren, was Object Pascal Programmierung angeht. Ich bin noch am Üben, deshalb auch dieses Programm und die Frage. Wenn ich mit Button6 den Zyklus starte, wir die Kurve auch gezeichnet, aber die Tastatur bzw. Mouse Eingabe ist gesperrt. Wer kann mir einen Tip geben, wie ich die Buttons abfragen kann während der Zeichnung der Linie? :gruebel: Gruß Jens
Delphi-Quellcode:
unit MAIN;
interface uses Windows, Classes, Graphics, Forms, Controls, Menus, Dialogs, StdCtrls, Buttons, ExtCtrls, ComCtrls, ImgList, StdActns, ActnList, ToolWin, Math; type TSDIAppForm = class(TForm) PaintBox1: TPaintBox; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; Button6: TButton; procedure PaintBox1Paint(Sender: TObject); procedure AchsenKreuz(); procedure ZeitVerlauf(u, ua, t, dt: Single); procedure Zyklus(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var SDIAppForm: TSDIAppForm; dt, t, xa, xaa: Single; implementation uses about; {$R *.dfm} //**** Aufbau der Anzeige **** procedure TSDIAppForm.PaintBox1Paint(Sender: TObject); begin AchsenKreuz(); end; //***** zeichnen des Zeitverlaufes **** procedure TSDIAppForm.Zyklus(Sender: TObject); begin // Anfangswerte t := 0; xa := 0; // Zeitschritt dt := 0.5; // Anfangspunkt Zeitverlauf anfahren PaintBox1.Canvas.MoveTo(30, 332); repeat // Laufende Zeit t := t + dt; // Signalvorgabe per Tastatur {************************************************** * hier soll eine Veränderung von xa * * durch Button1 - Button5 stattfinden können * ***************************************************} // Zeitverlauf zeichnen ZeitVerlauf(xa, xaa, t, dt); // Speichern der Anzeigewerte xaa := xa; // Warteschleife sleep(100); until (t = 72); end; //**** Signalwert auf 0 setzen **** procedure TSDIAppForm.Button1Click(Sender: TObject); begin xa := 0.0; end; //**** Signalwert auf 0.5 setzen **** procedure TSDIAppForm.Button2Click(Sender: TObject); begin xa := 0.5; end; //**** Signalwert auf 1.0 setzen **** procedure TSDIAppForm.Button3Click(Sender: TObject); begin xa := 1.0; end; //**** Signalwert um 0.1*dt erhöhen setzen **** procedure TSDIAppForm.Button4Click(Sender: TObject); begin if xa <= 1-0.1*dt then xa := xa+0.1*dt; end; //**** Signalwert um 0.1*dt erniedrigen setzen **** procedure TSDIAppForm.Button5Click(Sender: TObject); begin if xa >= 0.1*dt then xa := xa-0.1*dt; end; //**** Zyklischen Teil starten **** procedure TSDIAppForm.Button6Click(Sender: TObject); begin Zyklus(Sender); end; //**** Zeichnen eines Zeitverlaufes **** procedure TSDIAppForm.ZeitVerlauf(u, ua, t, dt: Single); begin PaintBox1.Canvas.Pen.Color := 0; PaintBox1.Canvas.Brush.Color := RGB(255, 255, 255); PaintBox1.Canvas.MoveTo(Trunc(30+8*(t-dt)), Trunc(332-100*ua)); PaintBox1.Canvas.LineTo(Trunc(30+8*t), Trunc(332-100*u)); end; //**** zeichnen eines Achsenkreuzes **** procedure TSDIAppForm.AchsenKreuz(); var I : Integer; T : String; begin PaintBox1.Canvas.Pen.Color := 0; PaintBox1.Canvas.Brush.Color := RGB(0, 0, 0); PaintBox1.Canvas.Rectangle(30,192,32,332); PaintBox1.Canvas.Rectangle(28,282,32,283); PaintBox1.Canvas.Rectangle(28,232,32,233); PaintBox1.Canvas.Brush.Color := RGB(255, 255, 255); PaintBox1.Canvas.TextOut(1, 325, '0,0'); PaintBox1.Canvas.TextOut(1, 275, '0,5'); PaintBox1.Canvas.TextOut(1, 225, '1,0'); for I := 0 to 72 do begin PaintBox1.Canvas.Rectangle(30+8*i,232,32+8*i,234); PaintBox1.Canvas.Rectangle(30+8*i,282,32+8*i,284); PaintBox1.Canvas.Rectangle(30+8*i,332,32+8*i,334); end; PaintBox1.Canvas.Brush.Color := RGB(255, 255, 255); for I := 0 to 7 do begin Str(i,T); PaintBox1.Canvas.TextOut(26+80*I, 335, T); PaintBox1.Canvas.Rectangle(30+80*I,230,32+80*I,236); PaintBox1.Canvas.Rectangle(30+80*I,280,32+80*I,286); PaintBox1.Canvas.Rectangle(30+80*I,330,32+80*I,336); end; PaintBox1.Canvas.TextOut(600, 335, '*10s'); end; end. |
Re: Tastatureingabe abfragen innerhalb einer Schleife
Fürs erste kannst du in deine Schleife
Delphi-Quellcode:
schreiben. Dies ist jetzt nur für Übungszwecke in Ordnung.
...
Application.ProcessMessages(); Sleep(50); ... Richtig wäre es, wenn du dich mit Threads auseinandersetzt und es dann in Threads machst. |
Re: Tastatureingabe abfragen innerhalb einer Schleife
Super.
Danke, funktioniert fürs erste sehr gut. |
Re: Tastatureingabe abfragen innerhalb einer Schleife
noch eine Frage,
wo kann ich ein leicht verständliches Tutorial zum Thema Thredas finden? |
Re: Tastatureingabe abfragen innerhalb einer Schleife
Hier dürfte ein einfacher Timer deutlich besser geeignet sein.
|
Re: Tastatureingabe abfragen innerhalb einer Schleife
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 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