Ampelsimulation in Lazarus?
Sehr geehrte gutefrage-Community,
ich bin gerade an der Bearbeitung einer Ampelsimulation, jedoch funktioniert die Implementierung der drei senkrechten Kreise nicht so wie gewünscht. Für Vorschläge/Tipps der Verbesserung stehe ich Ihnen gerne offen.
Unten abgebildet ist die bisherige Programmierung der Ampelsimulation in Lazarus (Free Pascal).
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
{ TAmpel }
TAmpel = class(TForm)
ZeichneAmpel: TButton;
procedure ZeichneAmpelClick(Sender: TObject);
private
procedure ZeichneKreis (Farbe:integer);
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Ampel: TAmpel;
implementation
{$R *.lfm}
procedure Wait (time:word);
var Start: Integer;
begin
Start := GetTickCount64;
while GetTickCount64 - Start <= time do
application.ProcessMessages;
end;
procedure ZeichneAmpelClick(Sender: TObject);
var
i, x, y, radius, Abstand: integer;
begin // Grundeinstellungen
radius := 50; // Radius der Kreise
Abstand := 20; // Abstand zwischen den Kreisen
x := 10 div 2; // Horizontale Position (in der Mitte des Fensters)
// mehrere Kreise senkrecht zeichnen
for i := 0 to 4 do // Zeichnet 5 Kreise
begin
y:= (i * (2 * radius + Abstand)) + radius; // Berechne vertikale Position
end;
end;
{ TAmpel }
procedure TAmpel.ZeichneKreis(Farbe:integer);
begin
Canvas.Pen.Color := Farbe;
Canvas.Brush.Color := Farbe;
Canvas.Ellipse(10, 10, 100, 100);
end;
procedure TAmpel.ZeichneAmpelClick(Sender: TObject);
begin
ZeichneKreis(clred);
wait(1000);
ZeichneKreis(clyellow);
wait(1000);
ZeichneKreis(clgreen);
end;
end.
1 Antwort
(...) jedoch funktioniert die Implementierung der drei senkrechten Kreise nicht so wie gewünscht.
Wenn die Kreise vertikal untereinander positioniert werden sollen, dann musst du beim Zeichnen auch die Position auf der y-Achse verändern. Aktuell zeichnest du den Kreis innerhalb der TAmpel.ZeichneKreis-Prozedur jedesmal an der selben Position.
Du könntest der Prozedur einen weiteren Parameter spendieren (z.B. für den Index, der angibt, der wievielte Kreis gezeichnet werden soll), anhand dessen du die y1- und y2-Argumente von Canvas.Ellipse berechnest. Die Berechnung für y1 hast du ja bereits in ZeichneAmpelClick und für y2 genügt es, den Kreisdurchmesser aufzurechnen.
Für Vorschläge/Tipps der Verbesserung stehe ich Ihnen gerne offen.
Wirf den Code, den du nicht verwendest (z.B. ZeichneAmpelClick) raus und binde möglichst alle Prozeduren (wie Wait) ruhig an die Forminstanz TAmpel.