kasowanie pojedyńczego elementu w Canvas

0

witam i proszę o pomoc!
rysuję w Canvas kilka elementów np. kilka prostych.
czy możliwe jest skasowanie tylko jednej z nich i pozostawienie innych?
rysuję przy użyciu MouseDown , MouseUp i MouseMove
jeśli kasowanie byłoby możliwe przez zaznaczenie SpeedButtonKasuj i "wskazanie" kliknięcie myszą odpowiedniej prostej - to wspaniale

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Drawing := True;
  Image.Canvas.MoveTo(X, Y);
  Origin := Point(X, Y);
  MovePt := Origin;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Drawing then
  begin
    DrawShape(Origin, Point(X, Y), pmCopy);
    Drawing := False;
  end;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if Drawing then
  begin
    DrawShape(Origin, MovePt, pmNotXor);
    MovePt := Point(X, Y);
    DrawShape(Origin, MovePt, pmNotXor);
  end;
end;

procedure TForm1.LineButtonClick(Sender: TObject);
begin
  DrawingTool := dtLine;
end;

procedure TForm1.DrawShape(TopLeft, BottomRight: TPoint; AMode: TPenMode);
begin
  with Image.Canvas do
  begin
    Pen.Mode := AMode;
    case DrawingTool of
      dtLine:
        begin
          Image.Canvas.MoveTo(TopLeft.X, TopLeft.Y);
          Image.Canvas.LineTo(BottomRight.X, BottomRight.Y);
        end;
        ............................. itd.

0

cos takiego nie jest niestety mozliwe.
canvas to z ang. płótno.... tak cos namalujesz to mozesz to najwyzej zamazac innym kolorem...

0

Możesz za to zrobić coś innego: rysując, dodatkowo tworzyć sobie listę, opisującą poszczególne figury. Odmalowanie okna byłoby narysowaniem w kolejności wszystkich elementów listy. Po kliknięciu na płótno odrysowywałbyś całość wyróżniając jakoś element, na współrzędne którego kliknięto. Po wybraniu usunięcia elementu, kasowałbyś go z listy i po prostu ponownie odrysowywał zawartość okna (już bez tegoż elementu - już nie ma go w liście).

0

jak nie można jak można:
robisz tak tworzysz liste lini ktore rysowałeś wraz z opisem matematycznym ich wspołrzędnych, dodatkowo zapisujesz kolor płótna (np rysyjesz czarne linie na czerwonym tle to czerwony jest kolorem plótna i jego zapisujesz).
Po klikniecie mysza na linie sprawdzasz w tablicy czy współrzędne znajdują się w zakresie wspołrzędnych danej lini a potem ja przerysowujesz tylko z ustawieniem

Pen.Colorr:=kolor plótna;

I powinno działać (niestety przy dużej ilości lini to troche niekorzystne-porównaj sobie opcje MS Paint'a wypełniania jakimś kolorem powierzchni zamkniętej)</delphi>

0

Ale można terż zrobić coś w rodzaju warstw
stworzyć dynamiczną tablice:

warstwy :array of TBitmap

i póżniej nakładac te "warstwy" na siebie, usuwać, zmieniać
aby wybrać warstwe trzeba by było
wybrać miejsce kliknięcia x,y
i sprawdzać <ort>po kolei</ort>

if warstwy[n].canvas.pixels[x,y] <> clWhite then
  warstwy[n].destroy;

Co o tym myślicie ?? :>

0

Kiedyś robiłem taki projekcik. Jeżeli chodzi o linie to sprawa jest prosta. Każda linia to rekord opisujący jej podstawowe właściwości: styl, kolor, grubość oraz współrzędne początka i końca. Tworzysz sobie, np. tablicę dynamiczną zawierającą rysowane po kolei linie - każda linia ma wtedy swój indeks. Obszar rysowania, np. powierzchnię formularza przedstawiasz jako tablicę dwuwymiarową, którą wypełniasz jakąś wartością mniejszą od zera (powiedzmy -1), bo jedna z twoich linii będzie miała indeks 0. Gdy linia, np. o indeksie 12 jest gotowa, na podstawie wzoru na prostą przechodzącą przez dwa punkty liczysz pozostałe punkty należące do narysowanej linii, i wypełniasz liczbami 12 odpowiednie komórki tablicy dwuwymiarowej, reprezentującej obszar rysowania. Podczas ruchu myszą nad formularzem, odpowiedni wątek sprawdza, czy zawartość komórki o indeksie [X,Y] różna jest od -1, gdzie X i Y to współrzędne położenia kursora myszy. Gdy nasz wątek stwierdzi, że w komórce [X,Y] jest liczba 12, wtedy linia o indeksie 12 przemalowywana jest, powiedzmy w kolorze czerwonym. Gdy kursor opuści obszar linii, program przemalowywuje ją zpowrotem w kolorze, w jakim została narysowana pierwotnie. Kliknięcie myszą może zaznaczyć linię na stałe, przerysowywując ją, powiedzmy stylem kreskowym. Usunięcie z tablicy zawierającej linie to już tylko wybranie odpowiedniej opcji z, np. pupup menu, lub wciśnięcie klawisza del i przemalowanie danej linii w kolorze tła, lub całego płótna bez niej.
Może sposób ten jest pamięciożerny, ale wyobrażasz sobie użytkownika oczekującego aż program przeanalizuje iteracyjnie rozległe tablice? Z drugiej strony zdaję sobie sprawę, że istnieją lepsze rozwiązania tego problemu.

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