Einzelnen Beitrag anzeigen

Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.757 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Canvas beim Zeichnen zu langsam

  Alt 31. Mai 2006, 13:26
Hallo Marcel,

habe Deine Unit mal etwas abgeändert
kann man vielleicht noch etwas mehr optimieren - aber so ist es schon schneller.

Eine Bremse bei Dir war das Du bei jeder Tauschaktion, das ganze Bild neu aufgebaut hast.
Das dauert.Es ist aber nur nötig, die zwei Vertauschungen neu zu zeichnen und das macht die
Version unten.

Grüße
Klaus

Delphi-Quellcode:
unit Unit1;

interface

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

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

type
  TDaten = record
    zahl: integer;
    farbe: TColor;
  end;

var
  Form1: TForm1;
  Daten: array of TDaten;
  l, r: integer;
  BMP: TBitmap;
implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
  var i: integer;
      temp_zahl: integer;
      temp_color: tColor;
begin
  randomize;

  SetLength(Daten,0);
  for i:=0 to 511 do
  begin
    SetLength(Daten,Length(Daten)+1);
    Daten[i].Zahl:=random(512)+1;;
    Daten[i].Farbe:=ClBlue;
  end;
  l:=0;
  r:=511;

      //DRAW
      With Form1.Canvas do
      begin
        brush.Color:=clWhite;
        rectangle(0,0,512,512);
        pen.Width:=1;
        for i:=0 to 511 do
        begin
          Pen.Color:=Daten[i].Farbe;
          Rectangle(i,Daten[i].Zahl,i+4,Daten[i].Zahl+4);
          Daten[i].Farbe:=ClBlue;
        end;
      end;
     //DRAW


  //BUBBLESORT
  repeat

  begin
    if Daten[l].Zahl > Daten[l+1].Zahl then
    begin

      // lösche rechteck an der alten Position
      Form1.canvas.pen.color:=clwhite;
      Form1.Canvas.Rectangle(l,Daten[l].Zahl,l+4,Daten[l].Zahl+4);
      Form1.Canvas.Rectangle(l+1,Daten[l+1].Zahl,l+1+4,Daten[l+1].Zahl+4);

      Temp_Zahl:=Daten[l].zahl;
      Daten[l].zahl:=Daten[l+1].zahl;
      Daten[l+1].zahl:=Temp_Zahl;


      // verschiebe Rechteck
      Form1.Canvas.Pen.Color:=clBlue;
      Form1.Canvas.Rectangle(l,Daten[l].Zahl,l+4,Daten[l].Zahl+4);
      Form1.Canvas.Rectangle(l+1,Daten[l+1].Zahl,l+1+4,Daten[l+1].Zahl+4);

      Temp_Color:=Daten[l].farbe;
      Daten[l].farbe:=Daten[l+1].farbe;
      Daten[l+1].farbe:=Temp_Color;

    end;
    inc(l);
    if l=r then
    begin
      dec(r);
      l:=0;
    end;

    for i:=r+1 to 511 do
      Daten[i].Farbe:=ClNavy;
    Daten[l].Farbe:=ClRed;
    Daten[l+1].Farbe:=ClGreen;
  end until l>=r;

end;

end.
Klaus
  Mit Zitat antworten Zitat