Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi canvas.copyrect zieht 'schlieren' (https://www.delphipraxis.net/111499-canvas-copyrect-zieht-schlieren.html)

Spiderpig_GER_15 4. Apr 2008 12:37


canvas.copyrect zieht 'schlieren'
 
Hallo,

ich habe folgendes Problem:
Ich möchte ein Farbiges rechteck (rot) mit canvas.copyrect kopieren, welches an eine schwarze linie angrenzt.
Das Problem dabei, entweder ich kopiere das rechteck mit der schwarzen linie, oder ich kopiere es nicht komplett, die folge: entweder ein riesen chaos mit dem schwarzen strich der linie, oder das phänomen, das das rote rechteck sich einfach nur verlängert.

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
i:integer;
quelle,ziel:trect;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
canvas.MoveTo(100,100);
canvas.lineto(100,500);
canvas.brush.color:=clred;
canvas.Pen.color:=clred;
canvas.Rectangle(101,150,200,200);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
i:=0;
repeat
quelle:=rect(101,150,200,200);
inc(i);
ziel:=rect(101+i,150,200+i,200);
canvas.CopyRect(ziel,canvas,quelle);
sleep(10);
until i = 50;
end;

end.
könnt ihr mir helfen, bzw alternativen erklären?

mfG
Spiderpig

PS: man müsste theoretisch zwischen 2 pixeln die 'linie' ziehen ab der kopiert werden soll oder? (hier zwischen pixel(x) 100 und 101)

Relicted 4. Apr 2008 13:11

Re: canvas.copyrect zieht 'schlieren'
 
also bei dem problem kann ich dir gerade nicht helfen aber 1-2 tipps geben :-)

1.) haben die globalen variablen eine bedeutung oder können die auch in den private bereich der klasse wandern?
2.) warum hängt ein "i" global deklariert da rum?! im normalfall nimmt man i als zählvariable und diese wird innerhalb einer funktion deklariert.
3.) bissl einrücken würde das ganze lesbarer machen.
4.) die abbruchbedingung der schleife würde ich sicherheitshalber auf i >= 50 machen weil wenn man sich das angewöhnt dann hat man wenn man später mal die funktion wartet wenniger problemen mit ner endlosschleife. (vielleicht machst du mal nicht nur ein inc() sondern 3 innerhalb eines durchlaufs.. )


das hier wäre meine "aufgeräumte" version:
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  canvas.MoveTo(100,100);
  canvas.lineto(100,500);
  canvas.brush.color:=clred;
  canvas.Pen.color:=clred;
  canvas.Rectangle(101,150,200,200);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  i : integer;
  Quelle,Ziel:trect;
begin
  i:=0;
  repeat
    quelle:=rect(101,150,200,200);
    inc(i);
    ziel:=rect(101+i,150,200+i,200);
    canvas.CopyRect(ziel,canvas,quelle);
    sleep(10);
  until i = 50;
end;
du könntest noch versuchen DoubleBuffered auf True zu setzen. vielleicht gehts dann besser? ich hab aber ansich kA

gruß
reli

Spiderpig_GER_15 4. Apr 2008 13:20

Re: canvas.copyrect zieht 'schlieren'
 
ok, so weit so gut xD

aber kann mir trotzdem vielleicht noch jemand bei meinem problem helfen?

mdG
SPiderpig


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:14 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