Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Tastatureingabe abfragen innerhalb einer Schleife (https://www.delphipraxis.net/121881-tastatureingabe-abfragen-innerhalb-einer-schleife.html)

diver03 6. Okt 2008 13:35


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.

Tyrael Y. 6. Okt 2008 13:53

Re: Tastatureingabe abfragen innerhalb einer Schleife
 
Fürs erste kannst du in deine Schleife

Delphi-Quellcode:
...
Application.ProcessMessages();
Sleep(50);
...
schreiben. Dies ist jetzt nur für Übungszwecke in Ordnung.

Richtig wäre es, wenn du dich mit Threads auseinandersetzt und es dann in Threads machst.

diver03 6. Okt 2008 14:08

Re: Tastatureingabe abfragen innerhalb einer Schleife
 
Super.

Danke, funktioniert fürs erste sehr gut.

diver03 6. Okt 2008 14:32

Re: Tastatureingabe abfragen innerhalb einer Schleife
 
noch eine Frage,

wo kann ich ein leicht verständliches Tutorial zum Thema Thredas finden?

Apollonius 6. Okt 2008 14:36

Re: Tastatureingabe abfragen innerhalb einer Schleife
 
Hier dürfte ein einfacher Timer deutlich besser geeignet sein.

Luckie 6. Okt 2008 14:54

Re: Tastatureingabe abfragen innerhalb einer Schleife
 
Zitat:

Zitat von diver03
noch eine Frage,

wo kann ich ein leicht verständliches Tutorial zum Thema Thredas finden?

Für eine neuen Frage erstell bitte einen neuen Thread. aber ein Tutorial kannst du hier auf meiner Seite finden: http://delphitutorials.michael-puff.de


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