Einzelnen Beitrag anzeigen

diver03

Registriert seit: 11. Dez 2007
24 Beiträge
 
Turbo Delphi für Win32
 
#1

Tastatureingabe abfragen innerhalb einer Schleife

  Alt 6. Okt 2008, 13:35
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?

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.
  Mit Zitat antworten Zitat