![]() |
Mehrere Markierungen in TImage setzen
Hallo,
wie kann ich mehrere Markierungen (z.B. Kreise) in ein TImage setzen? Aktueller Stand: Der User lädt ein beliebiges Bild in ein TImage Control. Neue Funktion: Der User soll Markierungen im Bild setzen können. Ich möchte folgende Funktionen haben: Button1 = Neue Markierung setzen (grün) Button2 = Neue Markierung setzen (blau) Button3 = Markierung löschen Bei Klick auf einen Button wird die Markierung in die Mitte des Bildes gesetzt. Der User kann die Markierung mit der Maus bewegen und neu positionieren. Es können pro Bild maximal 7 Markierungen möglich sein. Wenn der User auf eine Markierung klickt, soll sie hervorgehoben werden (damit man erkennt, welche Markierung aktiv ist). Mit dem Button "Markierung löschen" soll die aktive Markierung gelöscht werden. Das ganze Bild mit allen Markierungen soll auch gedruckt werden. Hat da jemand einen Ansatz für mich (oder einen fertigen Code) Vielen Dank für eure Hilfe, Ronald |
Re: Mehrere Markierungen in TImage setzen
Schau mal in der hilfe nach unter:
![]() ![]() ![]()
Delphi-Quellcode:
Bei Markierung löschen musst du entweder einen Teilbereich aus einem temp. Bitmap kopieren
procedure SoUndSo...
begin With ImageX.Picture.Bitmap do begin Canvas.Brush.Style := bsClear Canvas.Pen.Color := clGreen; Canvas.Rectangle(x,y,x2,y2); end; end; oder du lädst nas komplette bitmap neu und mals alle anderen Markierungen. |
Re: Mehrere Markierungen in TImage setzen
Hallo Matti,
für die statische Anzeige ist das sicher eine gute Sache, aber der User soll die Markierung ja auch verschieben können. Dann müsste ich bei der Lösung erst das Bild neu laden (um alle Markierungen zu löschen), dann alle alten Markierungen neu zeichnen und die aktuelle Markierung an die Mausposition setzen. Und den ganzen Vorgang bei jeder Mausbewegung erneut. Das wird dann wohl ziemlich flackern. Gibt es denn für das Verschieben der Markierung noch eine andere Möglichkeit ? Gruß, Ronald |
Re: Mehrere Markierungen in TImage setzen
Willkommen in der Delphi-PRAXiS, Ronald!
Du könntest für die zu verschiebenden Punkte jeweils ein ![]()
Delphi-Quellcode:
Das ist natürlich nur ein Anfang. Die Verwaltung der Shapes (Speichern der Referenzen, Begrenzung der Anzahl, Einfärben beim Anklicken, Löschen) sowie eine eventuelle Einschränkung der Mausbewegung mußt du noch ergänzen.
type
TForm1 = class(TForm) [...] private FMarker : TShape; FAnchor : TPoint; FOrgPos : TPoint; FPanning : Boolean; function CreateMarker (aColor: TColor): TShape; end; [...] CONST SHAPESIZE = 15; procedure TForm1.Button1Click(Sender: TObject); begin FMarker := CreateMarker(clLime); end; function TForm1.CreateMarker(aColor: TColor): TShape; begin Result := TShape.Create(Self); with Image1 do Result.SetBounds(Left + (Width - SHAPESIZE) div 2, Top + (Height - SHAPESIZE) div 2, SHAPESIZE, SHAPESIZE); Result.Parent := Self; Result.Shape := stCircle; Result.Brush.Color := aColor; Result.OnMouseDown := ShapeMouseDown; Result.OnMouseMove := ShapeMouseMove; Result.OnMouseUp := ShapeMouseUp; end; procedure TForm1.ShapeMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin FAnchor := Mouse.CursorPos; FOrgPos := TShape(Sender).BoundsRect.TopLeft; FPanning := True; end; procedure TForm1.ShapeMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if FPanning then begin TShape(Sender).Top := FOrgPos.Y + (Mouse.CursorPos.Y - FAnchor.Y); TShape(Sender).Left := FOrgPos.X + (Mouse.CursorPos.X - FAnchor.X); end; end; procedure TForm1.ShapeMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin FPanning := False; end; Gruß Hawkeye |
Re: Mehrere Markierungen in TImage setzen
[quote="RonaldMauthe"]Hallo Matti,
für die statische Anzeige ist das sicher eine gute Sache, aber der User soll die Markierung ja auch verschieben können. Dann müsste ich bei der Lösung erst das Bild neu laden (um alle Markierungen zu löschen), dann alle alten Markierungen neu zeichnen und die aktuelle Markierung an die Mausposition setzen. Und den ganzen Vorgang bei jeder Mausbewegung erneut. Das wird dann wohl ziemlich flackern. Wenn man es richtig macht nicht. - Das Bild neu laden ist schlecht, kopieren ist besser. - Die Koordinaten in einem Array zwischenspeichern. Zitat:
|
Re: Mehrere Markierungen in TImage setzen
nur mit EINEM TImage wird es nicht gehen. Denn ein TImage ist zur Anzeige EINES Bildes gedacht. Und Bilder haben die Eigenschaft, wie ein Blatt Papier, das man drau malen kann aber das was man mit dem stift gemalt hat kann man auf einem Blatt nicht verschieben.
|
Re: Mehrere Markierungen in TImage setzen
Vielen Dank für die Hilfe, bin damit weitergekommen.
Gruß, Ronald |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:41 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-2025 by Thomas Breitkreuz