Bir çizim componenti yapayım dedim ama bir yerde takıldım. Mesela ben objeleri seçebilmek için bir selectbox çizdiriyorum ama bu çizimi yaparken yavaşlık oluyor. Bir kaç komponent inceledim ama çok karışık ve nasıl bir mantık kullanmışlar anlayamadım. Buyrun yaptığım component. Neden seçerken yavaşlıyor anlamış değilim :

Aslında sevebi mousemove içinde paint procedurunu tekrar çağırmamdan kaynaklı. Ama bu procedure yi çağırmaz isem selectbox karışacak. invalidate ve repaint procedure lerinide çağırdım ama işe yaramadı.
Kod: Tümünü seç
unit Diagram;
interface
uses
Classes, Controls, Graphics;
type TPLCCustomDiagram = class(TCustomControl)
private
FDrawBuffer: TBitmap;
FSelectBoxBuffer: TBitmap;
FUseSelectBox: Boolean;
FMouseDown: Boolean;
FSelecting: Boolean;
FSelectBoxStartX: integer;
FSelectBoxStartY: integer;
protected
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure MouseMove(Shift: TShiftState; X, Y: integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure DrawSelectBox(X, Y: integer);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Paint; override;
published
property SelectBox: Boolean Read FUseSelectBox Write FUseSelectBox;
end;
implementation
constructor TPLCCustomDiagram.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FDrawBuffer := TBitmap.Create;
FSelectBoxBuffer := TBitmap.Create;
FUseSelectBox := True;
FSelecting := False;
end;
destructor TPLCCustomDiagram.Destroy;
begin
FSelectBoxBuffer.Free;
inherited Destroy;
end;
procedure TPLCCustomDiagram.Paint;
begin
FDrawBuffer.Width:=Width;
FDrawBuffer.Height:=Height;
FDrawBuffer.Canvas.Pen.Style:=psSolid;
FDrawBuffer.Canvas.Rectangle(0, 0, Width, Height);
Canvas.Draw(0, 0, FDrawBuffer);
end;
procedure TPLCCustomDiagram.MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer);
begin
FMouseDown := True;
end;
procedure TPLCCustomDiagram.MouseMove(Shift: TShiftState; X: Integer; Y: Integer);
begin
if(FMouseDown)then begin
DrawSelectBox(X, Y);
end;
end;
procedure TPLCCustomDiagram.MouseUp(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer);
begin
FSelecting := False;
FMouseDown := False;
end;
procedure TPLCCustomDiagram.DrawSelectBox(X, Y: integer);
var
TempX, TempY: integer;
begin
if(not FSelecting)then begin
FSelecting := True;
FSelectBoxStartX := X;
FSelectBoxStartY := Y;
Canvas.Brush.Style:=bsClear;
Canvas.Pen.Style:=psDashDot;
end;
Paint;
FSelectBoxBuffer.Canvas.Pen.Style:=psDashDot;
if(X-FSelectBoxStartX < 0) then
FSelectBoxBuffer.Width:=abs(X-FSelectBoxStartX)
else
FSelectBoxBuffer.Width:=X-FSelectBoxStartX;
if(Y-FSelectBoxStartY < 0) then
FSelectBoxBuffer.Height:=abs(Y-FSelectBoxStartY)
else
FSelectBoxBuffer.Height:=Y-FSelectBoxStartY;
FSelectBoxBuffer.Canvas.Rectangle(0, 0, abs(X-FSelectBoxStartX), abs(Y-FSelectBoxStartY));
if(FSelectBoxStartX > X)then
TempX := X
else
TempX := FSelectBoxStartX;
if(FSelectBoxStartY > Y)then
TempY := Y
else
TempY := FSelectBoxStartY;
Canvas.Draw(TempX, TempY, FSelectBoxBuffer);
end;
end.