Obiekty graficzne

0

Witam!
Potrzebuję w swoim programie tworzyć obiekty graficzne (prawdopodobnie będą to tylko prostokąty), które następnie muszę mieć możliwość swobodnego przemieszczania. Coś na kształt budowania z klocków (ale niech to nie będzie mylące, bo program jest bardzo poważny), lub raczej małego programu do grafiki wektorowej (np. edytor rysunków w MS Word). Każdy z tych klocków musi posiadać zestaw parametrów.

Pierwsze co mi przyszło na myśl, to dynamiczna tablica klas (lub może lepiej po prostu struktur). Dodając nowy "klocek" tworzę taką strukturę, ustawiam jej parametry i wskaźnik do niej wrzucam do jakiejś tablicy. W zdarzeniu OnPaint trzeba by w pętli pobierać z tych struktur położenie elementów i je rysować. Tylko w takim przypadku, przy przesuwaniu myszą, po kliknięciu będę musiał w jakiejś pętli przelecieć po wszystkich obiektach, aby wiedzieć, który element przenosić. Nie jest to raczej optymalne rozwiązanie (ważne jest również położenie obiektów na osi Z).

Może lepszym sposobem będzie tworzenie obiektów klasy TShape, a pod właściwość Tag podczepiać wskaźnik do struktury zawierającej wszystkie potrzebne mi parametry?

Jestem ciekaw, czy znacie jakieś dobre i sprawdzone rozwiązania.

P.S. Do tego pytania jak ulał pasuje moja stopka :p

0

A jakby tak stworzyć klasę zawierającą parametry ORAZ (jako pole klasy) obiekt TShape? Obiekty tej klasy wstawiasz w tablicę, a że masz Shape więc nie troszczysz się o rysowanie...

Na przykład jakoś tak:

unit Unit1;
interface
uses
Windows, Classes, Controls, StdCtrls, ExtCtrls, Forms, Graphics, SysUtils;

type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
end;

type
TKlocek = class
private
Widok: TShape;
fVisible : Boolean;

public
procedure SetCoord(NewCoord:TRect);
function GetCoord:TRect;
procedure Show;
procedure Hide;
property Visible: Boolean read fVisible;
constructor Create(AOwner:TComponent);
destructor Destroy; override;
end;

var
Form1: TForm1;
Klocki: array of TKlocek;
// sz: TShape;
implementation
{$R *.dfm}
constructor TKlocek.Create(AOwner:TComponent);
begin
inherited Create;
Widok:=TShape.Create(AOwner);
Widok.Parent:=(AOwner as TWinControl);
Widok.Shape:=stRectangle;
Widok.Brush.Color:=clBlack;
Widok.Brush.Style:=bsSolid;
Widok.Pen.Color:=clRed;
Widok.Pen.Style:=psSolid;
end;

destructor TKlocek.Destroy;
begin
Widok.Free;
inherited Destroy;
end;

procedure TKlocek.Show;
begin
Widok.Show;
end;

procedure TKlocek.Hide;
begin
Widok.Hide;
end;

procedure TKlocek.SetCoord(NewCoord:TRect);
begin
Widok.SetBounds(NewCoord.Left, NewCoord.Top, NewCoord.Right-NewCoord.Left, NewCoord.Bottom-NewCoord.Top);
end;

function TKlocek.GetCoord : TRect;
begin
Result:=Widok.BoundsRect;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Coord:TRect;
begin
Coord.Left:=Random(200);
Coord.Right:=200+Random(200);
Coord.Top:=Random(100);
Coord.Bottom:=100+Random(100);

SetLength(Klocki, Succ(Length(Klocki)));
Klocki[High(Klocki)]:=TKlocek.Create(Form1);
Klocki[High(Klocki)].SetCoord(Coord);
Klocki[High(Klocki)].Show;

Coord:=Klocki[High(Klocki)].GetCoord;
Label1.Caption:=IntTostr(Coord.Left)+' '+IntTostr(Coord.Right)+' '+
IntToStr(Coord.Top)+' '+IntToStr(Coord.Bottom);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
i:integer;
begin
for i:=High(Klocki) downto 0 do
Klocki[i].Free;
end;

end.

Hm, napisałem pierwszy w zyciu konstruktor, nie mówiąc juz o destruktorze...

0

Hm, napisałem pierwszy w zyciu konstruktor, nie mówiąc juz o destruktorze...

To moje gratulacje :-)
A co do kodu, to w chacie przerobie sobie na C++ i przetestuje. Dzięki za kod!
W sumie zastanawiałem się, czym różni się Twój pomysł od mojego, aby do Tag przypisywać wskaźnik do struktury. Chyba tylko tym, że u Ciebie tworze jeden obiekt dynamicznie, a u mnie dwa (TShape i struktura) i jeszcze muszę jedno podczepić pod drugie.
Więc Twój sposób jest bardziej optymalny [browar]

0

Tylko takie jedno pytanie: nie łatwiej było utworzyć to jako komponent pochodny od TShape? Jedynie wzbogacić o odpowiednie właściwości.

0

Dyrobates ma racje, będzie to chyba szybsze i prostsze rozwiązanie.

0

Zgadza się. Dzięki za pomoc chłopaki!
[browar]

1 użytkowników online, w tym zalogowanych: 0, gości: 1