Einzelnen Beitrag anzeigen

cetinbiryoldayim

Registriert seit: 6. Mai 2008
33 Beiträge
 
#1

Projekt mit PaintBoxen funktioniert nich wie gewollt :/

  Alt 22. Mai 2008, 21:03
Hey Leute,
ich hab mal wieder ein großes Prolem für mich bzw. ein kleines Problem für euch.

Ich habe folgende Anwendung programmiert, die durch Eingabe von 4 Werten (somit 2 Koordinaten, 2 Eckpunkte für ein Rechteck) ein Rechteck auf einer PaintBox darstellen soll.
Sobald der Timer durch den Button6-Click enabled wird soll das Rechteck(=Balken im Programm) mit jedem Timerdurchlauf auf der X-Achse und der Y-Achse verschoben werden.

zusätzliche Informationen:
BalkenKoordinaten[1..8,0..4]: array of integer
--> speichert maximal 8 Rechtecke (1..8 )
--> mit ihrer x-Richtung (Speicherstelle 0),
--> ihren Koordinaten x1,y1,x2,y2 (Speicherstelle 1..4)

FEHLER: die Rechtecke werden nicht verschoben in x und y Richtung

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    PB_ViewingBox: TPaintBox;
    PB_BufferBox: TPaintBox;
    I_Background: TImage;
    I_Mask: TImage;
    I_Inhalt: TImage;
    Label14: TLabel;
    Label15: TLabel;
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Button2: TButton;
    Timer1: TTimer;
    Label7: TLabel;
    Button3: TButton;
    Button4: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  strict private
  public
    procedure definiereMaskundInhaltRects();
    function invertiereXRichtung(p_nr:integer):integer;
    procedure frageXRichtung(p_nr: integer);

    procedure ZeichneNeu();
    procedure ZeichneBackground();
    procedure ZeichneMaskAndInhalt();
    procedure AusgabeViewingBox();
    procedure zeichneBalken(x1,y1,x2,y2: integer);
  end;

var
  Form1: TForm1;
  anzahlBalken: integer = 0;
  BalkenKoordinaten: array[1..8,0..4] of integer;
  BackgroundZielRect: TRect;
  BackgroundQuellRect: TRect;
  MaskZielRect: array[1..8] of TRect;
  MaskQuellRect: array[1..8] of TRect;
  InhaltZielRect: array[1..8] of TRect;
  InhaltQuellRect: array[1..8] of TRect;
  BufferBoxZielRect: TRect;
  BufferBoxQuellRect: TRect;
  gedrueckteTasten: array[0..3] of boolean;
  geschwX: integer = 5; // Geschwindigkeit in X
  geschwY: integer = 1; // und Y


implementation

{$R *.dfm}






procedure TForm1.Timer1Timer(Sender: TObject);
var i: integer;
begin

  for i:=1 to anzahlBalken do
  begin
    frageXRichtung(i);

    if BalkenKoordinaten[i,0] = 0 then
    begin
      BalkenKoordinaten[i,1] := BalkenKoordinaten[i,1]-geschwX;
      BalkenKoordinaten[i,3] := BalkenKoordinaten[i,3]-geschwX;
    end;

    if BalkenKoordinaten[i,0] = 1 then
    begin
      BalkenKoordinaten[i,1] := BalkenKoordinaten[i,1]+geschwX;
      BalkenKoordinaten[i,3] := BalkenKoordinaten[i,3]+geschwX;
    end;

    BalkenKoordinaten[i,2] := BalkenKoordinaten[i,2]-geschwY;
    BalkenKoordinaten[i,4] := BalkenKoordinaten[i,4]-geschwY;
  end;
  ZeichneNeu();
  label7.caption := IntToStr(StrToInt(label7.caption)+1)
end;

procedure TForm1.ZeichneNeu();
begin
  ZeichneBackground();
  ZeichneMaskAndInhalt();
  AusgabeViewingBox();
end;


procedure TForm1.definiereMaskundInhaltRects();
begin
  I_Mask.Canvas.Brush.Color := clBlack;
  I_Mask.Canvas.Pen.Color := clBlack;
  I_Mask.Canvas.Rectangle(BalkenKoordinaten[anzahlBalken,1],BalkenKoordinaten[1,2],BalkenKoordinaten[anzahlBalken,3],BalkenKoordinaten[anzahlBalken,4]);

  MaskZielRect[anzahlBalken] := Rect(BalkenKoordinaten[anzahlBalken,1],BalkenKoordinaten[anzahlBalken,2],BalkenKoordinaten[anzahlBalken,3],BalkenKoordinaten[anzahlBalken,4]);
  MaskQuellRect[anzahlBalken] := Rect(BalkenKoordinaten[anzahlBalken,1],BalkenKoordinaten[anzahlBalken,2],BalkenKoordinaten[anzahlBalken,3],BalkenKoordinaten[anzahlBalken,4]);


  I_Inhalt.Canvas.Brush.Color := clBlue;
  I_Inhalt.Canvas.Pen.Color := clBlue;
  I_Inhalt.Canvas.Rectangle(BalkenKoordinaten[anzahlBalken,1],BalkenKoordinaten[anzahlBalken,2],BalkenKoordinaten[anzahlBalken,3],BalkenKoordinaten[anzahlBalken,4]);

  InhaltZielRect[anzahlBalken] := Rect(BalkenKoordinaten[anzahlBalken,1],BalkenKoordinaten[anzahlBalken,2],BalkenKoordinaten[anzahlBalken,3],BalkenKoordinaten[anzahlBalken,4]);
  InhaltQuellRect[anzahlBalken] := Rect(BalkenKoordinaten[anzahlBalken,1],BalkenKoordinaten[anzahlBalken,2],BalkenKoordinaten[anzahlBalken,3],BalkenKoordinaten[anzahlBalken,4]);

end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  BackgroundZielRect := Rect(0,0,PB_BufferBox.Width,PB_BufferBox.Height);
  BackgroundQuellRect := Rect(0,0,I_Background.Width,I_Background.Height);

  BufferBoxZielRect := Rect(0,0,PB_ViewingBox.Width,PB_ViewingBox.Height);
  BufferBoxQuellRect := Rect(0,0,PB_BufferBox.Width,PB_BufferBox.Height);
end;


procedure TForm1.frageXRichtung(p_nr: integer);
begin
  if BalkenKoordinaten[p_nr,1]>geschwX then
  begin
    BalkenKoordinaten[p_nr,0] := invertiereXRichtung(p_nr);
  end;
  if BalkenKoordinaten[p_nr,3]>(400-geschwX) then
  begin
    BalkenKoordinaten[p_nr,0] := invertiereXRichtung(p_nr);
  end;
end;


function TForm1.invertiereXRichtung(p_nr: integer):integer;
begin
  if BalkenKoordinaten[p_nr,0] = 0 then
  begin
    result := 1;
  end;
  if BalkenKoordinaten[p_nr,0] = 1 then
  begin
    result := 0;
  end;
end;


procedure TForm1.zeichneBalken(x1,y1,x2,y2: integer);
begin
  BalkenKoordinaten[anzahlBalken,1] := x1;
  BalkenKoordinaten[anzahlBalken,2] := y1;
  BalkenKoordinaten[anzahlBalken,3] := x2;
  BalkenKoordinaten[anzahlBalken,4] := y2;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  anzahlBalken := anzahlBalken+1;
  zeichneBalken(StrToInt(Edit1.Text),StrToInt(Edit2.Text),
                StrToInt(Edit3.Text),StrToInt(Edit4.Text));
  definiereMaskundInhaltRects();
  zeichneMaskAndInhalt();
end;


procedure TForm1.ZeichneBackground();
begin
  PB_BufferBox.Canvas.CopyMode := cmSrcCopy;
  PB_BufferBox.Canvas.CopyRect(BackgroundZielRect,
                               I_Background.Canvas,
                               BackgroundQuellRect);
end;


procedure TForm1.ZeichneMaskAndInhalt();
var i: integer;
begin
  for i:=1 to anzahlBalken do
  begin
    PB_BufferBox.Canvas.CopyMode := cmSrcAnd;
    PB_BufferBox.Canvas.CopyRect(MaskZielRect[i],
                                 I_Mask.Canvas,
                                 MaskQuellRect[i]);

    PB_BufferBox.Canvas.CopyMode := cmSrcPaint;
    PB_BufferBox.Canvas.CopyRect(InhaltZielRect[i],
                                 I_Inhalt.Canvas,
                                 InhaltQuellRect[i]);
  end;
end;


procedure TForm1.AusgabeViewingBox();
begin
  PB_ViewingBox.Canvas.CopyMode := cmSrcCopy;
  PB_ViewingBox.Canvas.CopyRect(BufferBoxZielRect,
                                PB_BufferBox.Canvas,
                                BufferBoxQuellRect);
end;


procedure TForm1.Button3Click(Sender: TObject);
begin
  ZeichneBackground();
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  AusgabeViewingBox();
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Timer1.Enabled := true;
end;

end.
  Mit Zitat antworten Zitat