Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Canvas als Objekt? (https://www.delphipraxis.net/10385-canvas-als-objekt.html)

RobertS 17. Okt 2003 14:20


Canvas als Objekt?
 
Hallo Delphianer!

ich bin schon seid 2 Tagen vergebens auf der Suche für mein Problem.

Es geht um folgendes:

Ich habe auf einem Panel/painbox (was auch immer) beliebig viele 1px breite Linien.

• Die Linien können sich natürlich auch überschneiden.
• Die Linien können in jedem beliebigen Winkel gemalt sein


Jetzt kommt der schwierige Teil:
Die Linien müssen anwählbar sein, d.h bei Mausklick reagieren.



Ich habe ja schon versucht über Shapes das Teil zu realisieren aber leider bekomme ich bei Shapes auch ein Klick Event auch wenn der Part eigentlich "transparent" ist.

Ist dies über Canvas möglich, das Problem da bei ist ja das meine Linie in keinster Weise ansprechbar sind.
Auch über die Hintergrundfarbe der Aktuellen Mausposition habe ich schon versucht aber woher weiß ich welche Linie ich jetzt geklickt habe...

Habe leider keine Idee mehr, vielleicht kann mir ja jemand aus dem tollem Forum weiterhelfen.


Danke schonmal für alle Antworten.


mfg r

OLLI_T 17. Okt 2003 14:36

Re: Canvas als Objekt?
 
HY Robert!
Das hat nix mit TCanvas zu tun. Das ist nur ein Wrapper, der die wichtigsten GDI Funktionen kapselt.

Das ist vielmehr eine gute Gelegenheit, objektorientiertes Programmieren zu lernen. Erstelle Dir eine Klasse TLinie abgeleitet von TObject, die die Koordinaten enthält. Dann brauchst Du ne public Methode HitTest, der Du die Mausposition relativ zu Deiner Zeichenfläche übergibst. Darin testet Du ob der Punkt auf Deiner Linie liegt. Ist das er Fall, wird ein Flag Select gesetzt.
Jetzt noch ein dynamisches Array, das beliebig viele Linienobjekte speichern kann und alles ist gut, eventuell ne Containerklasse drumherum mit AddLinie, DeleteLinie, Repaint, etc. Beim Zeichnen berücksichtigst Du dann Select-Flag und stellst die betreffende Linie z. B. in ner anderen Farbe dar.

So kannst Du auch noch andere geometrische Figuren kapseln, wenn Du alle von einer Basisklasse ableitest ... bla bla bla

Viel Spass

OLLI

Leuselator 17. Okt 2003 15:30

Re: Canvas als Objekt?
 
Wie OLLI_T es sagte, würde auch ich in folgende Richtung marschieren:

Delphi-Quellcode:
  TMyLineCoord = Record
    Start : TPoint;
    Ende : TPoint;
  end;

  TMyLine = class(TObject)
  private
    FCoord : TMyLineCoord;
  protected
  public
    property Koordinaten : TMyLineCoord read FCoord write FCoord ;
    procedure DrawAtCanvas(DerCanvas: TCanvas; DerPen : TPen);
    function IstDasDeinPunkt(DerPunkt : TPoint):Boolean;
    constructor CreateIt;
    destructor Destroy; override;
  published
  end;

implementation

constructor TMyLine.CreateIt;
begin
  inherited Create;
  FCoord.Start.x := 0;
  FCoord.Start.y := 0;
  FCoord.Ende .x := 0;
  FCoord.Ende .y := 0;
end;

destructor TMyLine.Destroy;
begin
  inherited;
end;

procedure TMyLine.DrawAtCanvas(DerCanvas: TCanvas; DerPen : TPen);
var TempPen : TPen;
begin
  TempPen := DerCanvas.Pen;
  DerCanvas.Pen :=  DerPen;
  DerCanvas.MoveTo(FCoord.Start.x,FCoord.Start.y);
  DerCanvas.LineTo(FCoord.Ende.x,FCoord.Ende.y);
  DerCanvas.Pen :=  TempPen;
end;

function TMyLine.IstDasDeinPunkt(DerPunkt: TPoint): Boolean;
begin
  Result := DenkDirSelberAusWieDuPrüfstObDerPunktAufDerLinieLiegt;
end;
Du verwaltest eine TList mit TMyLine-Objekten. Immer wenn Eine neue Linie dazukommt, erweiterst Du die TList um ein solches Element.
In dem Onclickereignis Deiner Canvas-Componente gehst Du die Liste Durch und Chckst ob der Punkt draufliegt:
Delphi-Quellcode:
function GetLineUnderPoint(DerPunkt:TPoint):Integer;
var i : Integer;
begin
  Result := -1;
  for i := 0 to FMeineLinienListe.Count-1 do begin
    if TMyLine(FMeineLinienListe[i]).IstDasDeinPunkt(DerPunkt) then begin
      Result := i;
      Break;
    end;
  end;
end;

OLLI_T 17. Okt 2003 17:58

Re: Canvas als Objekt?
 
WOW Leuselator!

Da hast Du Dir aber echt Mühe gemacht. Gibt es sowas in der Art schon in der Library? Wäre sicher einen Eintrag wert.


Viele Grüsse + schönes WE :hi:

OLLI

RobertS 24. Okt 2003 14:41

Re: Canvas als Objekt?
 
Ich habe es jetzt gelöst, zwar anders aber trotzdem danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz