AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Canvas als Objekt?

Ein Thema von RobertS · begonnen am 17. Okt 2003 · letzter Beitrag vom 24. Okt 2003
Antwort Antwort
RobertS
(Gast)

n/a Beiträge
 
#1

Canvas als Objekt?

  Alt 17. Okt 2003, 14:20
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
  Mit Zitat antworten Zitat
OLLI_T

Registriert seit: 13. Okt 2003
Ort: Nähe Wetzlar / Hessen
143 Beiträge
 
Delphi 5 Enterprise
 
#2

Re: Canvas als Objekt?

  Alt 17. Okt 2003, 14:36
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
No Pain No Gain!
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#3

Re: Canvas als Objekt?

  Alt 17. Okt 2003, 15:30
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;
Tim Leuschner
  Mit Zitat antworten Zitat
OLLI_T

Registriert seit: 13. Okt 2003
Ort: Nähe Wetzlar / Hessen
143 Beiträge
 
Delphi 5 Enterprise
 
#4

Re: Canvas als Objekt?

  Alt 17. Okt 2003, 17:58
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

OLLI
No Pain No Gain!
  Mit Zitat antworten Zitat
RobertS
(Gast)

n/a Beiträge
 
#5

Re: Canvas als Objekt?

  Alt 24. Okt 2003, 14:41
Ich habe es jetzt gelöst, zwar anders aber trotzdem danke.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz