POWAZNY PROBLEM...

0

Ehh...zanim dojde do meritum to musicie przeczytac troszke Kb tekstu...

Opisze Wam dokladnie na czym polega moj problem. Wydaje mi sie ze rozwiazanie
nie jest zbyt trudne, lecz ja nie dysponuje taka wiedza a to dla mnie kwestia zycia lub smierci.
Wyobrazcie sobie ze na formie mam kilkadziesiat malych obrazkow porozrzucanych
po niej losowo. Teraz gdy klikam na jeden obrazek a nastepnie na drugi to
pomiedzy tymi obrazkami rysuje sie linia(Rysuje ja metada Canavs.LineTo)
Pozniej znowu klikam na jakis obrazek i na nastepny i rysuje sie kolejna
linia(jest to raczej odcinek laczacy te dwa obrazki ale mam nadzieje ze
wybaczycie mi ta niescislosc), itd.
W pewnym momencie podczas rysowania kolejnej linii stwierdzilem ze sie
pomylilem i ta linia tutaj nie pasuje. i Co teraz? Pasowalo by ta linie
zdjac, tylko jak? NIe moge po tej linii narysowac innej w kolorze tla bo tlo
to jakistam obrazek. NIe moge odswierzyc tla calego obrazka bo zmarza sie
tez inne linie.
Rozwiazaniem jak mniemam, jest utworzenie linii jako obiektu, ktory bede
mogl tworzyc i niszyc na zawolanie. A w momencie niszczenia Canvas tla
odrysuje sie tylko w miejscu gdzie byla linia.
Zabralem sie wiec do tworzenia komponentu. Komponent opieral na klasie
TGraphicControl, nie wiem czy to byl trafny wybor.

Tak przedstawia sie ten komponent.

unit Linia;

interface

uses
Windows, Messages, SysUtils, Classes, Controls, Graphics, Forms, Dialogs,
StdCtrls;
type
TLinia = class(TGraphicControl)

private
{ Private declarations }
FPen :TPen;
FPoczatekX,FPoczatekY : Integer;
FKoniecX, FKoniecY : Integer;
procedure SetPen(Value: TPen);
procedure SetPoczatekX(Value: Integer);
procedure SetPoczatekY(Value: Integer);
procedure SetKoniecX(Value: Integer);
procedure SetKoniecY(Value: Integer);
procedure Odmaluj (Sender: TObject);
protected
{ Protected declarations }
procedure Paint; override;
public

constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
{ Public declarations }
published
property Pen: TPen read FPen write SetPen;
property Width default 50;
property Height default 20;
property PoczatekX: Integer read FPoczatekX write SetPoczatekX;
property PoczatekY: Integer read FPoczatekY write SetPoczatekY;
property KoniecX: Integer read FKoniecX write SetKoniecX;
property KoniecY: Integer read FKoniecY write SetKoniecY;
end;

procedure Register;

implementation

constructor TLinia.Create (AOwner: TComponent);
begin
inherited Create(AOwner);
FPen:= TPen.Create;
FPen.OnChange := Odmaluj;
Width:= 50;
Height:= 20;
KoniecX:=50;
KoniecY:=20;
end;

destructor TLinia.Destroy;
begin
inherited Destroy;
FPen.Free;
end;

procedure TLinia.Odmaluj(Sender: TObject);
begin
Invalidate;
end;

procedure TLinia.Paint;
var i: integer;
begin

Canvas.Pen:= FPen;{
Canvas.MoveTo(FPoczatekX, FPoczatekY);
Canvas.LineTo(FKoniecX, FKoniecY);}

begin

Canvas.MoveTo(0,10);
Canvas.LineTo(100,10);
end;
end;

procedure TLInia.SetPen(Value: TPen);
begin
FPen.Assign(Value);
end;

procedure TLinia.SetPoczatekX(Value: Integer);
begin
if (Value&lt&gtFPoczatekX) then
begin
FPoczatekX := Value;
Invalidate;
end;
end;

procedure TLinia.SetKoniecX(Value: Integer);
begin
if (Value&lt&gt FKoniecX) then
begin
FKoniecX := Value;
Invalidate;
end;
end;

procedure TLinia.SetKoniecY(Value: Integer);
begin
if (Value&lt&gtFKoniecY) then
begin
FKoniecY := Value;
Invalidate;
end;
end;

procedure TLinia.SetPoczatekY(Value: Integer);
begin
if (Value&lt&gtFPoczatekY) then
begin
FPoczatekY := Value;
Invalidate;
end;
end;

procedure Register;
begin
RegisterComponents('Wodzu', [TLinia]);
end;

end.

jak widzicie jest bardzo prosty. To zwykla linia. Myslalem ze osiagnalem to
co chcialem. Niestety nie przewidzialem jednego.
Kiedy poloze komponent TLinia na formie to jego Canvas moze przeslonic mi
jakis obrazek ktory juz lezy na formie! A wtedy nie bede mogl kliknac na ten
obrazek. I Tu wlasnie lezy pies pogrzebany...Jak to obejsc? Czy jest to w
ogole mozliwe?

A moze ja zle podchodze do problemu?

Moze mozna w swoim programie zdefiniowac linie jako obiekt i w razie jej
usuniecia odrysowac tylko to miejsce gdzie lezala linia?

Prosze poradzcie mi cos...

Tydzien juz nad tym siedze i nic nie moge zrobic...

Moze ktos z Was ma jakis pomysl?

hmm...

Dzieki za poswiecony czas i ze chcialo Wam sie to wszystko czytac..--take care,

Wodzu

0

Ekhm.. taki długi post, że nie wiem czy moja odpowiedź jest dobra. Po pierwsze - przejrzałem post tak w 70% więc może czegoś nie zauważyłem, ale czy nie wsytarczy w delphi kliknąc na linię rmb i wybrać Control -&gt Send to back czy jakoś tak? Poza tym odrysowanie miejsca w którym była linia też nie jest głupie, szxczególnie że mógłbyś gdzieś spisywać jakie istnieją linię i wtedy odrysować cały obrazek i linię wg. jakichs tam zmiennych.--, tradycyjnie pozdrawiam - Numi.

0

Ehh...x2. Ja nie wiem jak moglem zapomniec o tej procedurze!!! :[[
Od tego slonca chyba mi sie mozg zlasowal... :[[ :[[

Dzieki!

Rozwiazanie mialem tuz pod nosem... :D

Wielkie Dzieki jeszcze raz...

--take care,

Wodzu

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