Auf Paintbox schreiben
-
- Beiträge: 489
- Registriert: Sa 5. Apr 2008, 09:37
- OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
- CPU-Target: 32Bit /64 Bit
- Wohnort: Nähe Freiburg i.Br.
Auf Paintbox schreiben
hallo zusammen,
ich möchte auf einer Paintbox auf ein HG -Bild schreiben.
Das ganze soll als Bitmap gespeichert werden.
Die Koordinaten, Schriftgrösse, -Art usw. möchte ich zusätzlich zur Weiterverwendung in einem Record speichern.
Wie würdet Ihr das am Besten umsetzen.
Ich habe mir überlegt dass der Anwender entweder direkt auf der Paintbox schreibt, oder ein Label oder so auf der Paintbox ablegt und die Schrift-Art-Grösse usw. aus Voreinstellungen übernommen werden.
Das Ganze so in Richtung Windows Paint, nur eben dass die Werte zusätzlich in einem Record gespeichert werden können.
Gibts da irgendwo ein Beispiel?
Dake für eure Info
Gruss KH
ich möchte auf einer Paintbox auf ein HG -Bild schreiben.
Das ganze soll als Bitmap gespeichert werden.
Die Koordinaten, Schriftgrösse, -Art usw. möchte ich zusätzlich zur Weiterverwendung in einem Record speichern.
Wie würdet Ihr das am Besten umsetzen.
Ich habe mir überlegt dass der Anwender entweder direkt auf der Paintbox schreibt, oder ein Label oder so auf der Paintbox ablegt und die Schrift-Art-Grösse usw. aus Voreinstellungen übernommen werden.
Das Ganze so in Richtung Windows Paint, nur eben dass die Werte zusätzlich in einem Record gespeichert werden können.
Gibts da irgendwo ein Beispiel?
Dake für eure Info
Gruss KH
-
- Lazarusforum e. V.
- Beiträge: 2808
- Registriert: Fr 22. Sep 2006, 10:38
- OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
- Wohnort: Hessen
- Kontaktdaten:
Re: Auf Paintbox schreiben
Hallo khh,khh hat geschrieben: ich möchte auf einer Paintbox auf ein HG -Bild schreiben.
ist vielleicht die Prozedur canvas.textout etwas für dich? Hier kannst du die Koordinaten gleich eingeben, an denen der Text erscheint.
Musst mal gucken, wenn du den Befehl textout verwendest, würde ich dir unter Umständen empfehlen, eine TImage statt eine Paintbox zu verwenden.
Viele Grüße, Euklid
-
- Beiträge: 489
- Registriert: Sa 5. Apr 2008, 09:37
- OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
- CPU-Target: 32Bit /64 Bit
- Wohnort: Nähe Freiburg i.Br.
hallo zusammen,
Daraus ergibt sich aber folgendes:
Owner des Tedit ist die Paintbox, Parent das Form.
Die Paintbox hab ich auf ein Panel gelegt, damit man auch sieht wo man arbeitet. Da aber das Panel und die Paintbox nicht als Parent des Tedit aktzepiert wird hab ich mit :
ScreenToClient(Mouse.CursorPos);
die Einfügeposition des TEdit berechnet. Bis hierhin funktioniert das auch wunderbar.
das Eingabefeld lässt sich an der Mousepos. erzeugen, ausblenden und der Text kann auch mit textout auf eine _feste_ position auf der Paintbox ausgeben werden. Wenn ich jetzt aber Tedit.left und Tedit.top verwende um den text mit textout auf die Canvas der paintbox zu positionieren funktioniert das nicht.
Ich denk mal das sind ja auch die Koordinaten auf der Form.
Wie bekomme ich nun die richtigen Koordinaten auf dem paintbox.canvas?
ich hoffe ich hab mich einigermassen verständlich ausgedrückt.
vieleicht geht alles auch viel einfacher ??
Danke für eure Hilfe
Gruss KH
das hab ich jetzt so gemacht, funktioniert auch einwandfrei.Ich würde ein TEdit beim Cursor platzieren.
Daraus ergibt sich aber folgendes:
Owner des Tedit ist die Paintbox, Parent das Form.
Die Paintbox hab ich auf ein Panel gelegt, damit man auch sieht wo man arbeitet. Da aber das Panel und die Paintbox nicht als Parent des Tedit aktzepiert wird hab ich mit :
ScreenToClient(Mouse.CursorPos);
die Einfügeposition des TEdit berechnet. Bis hierhin funktioniert das auch wunderbar.
das Eingabefeld lässt sich an der Mousepos. erzeugen, ausblenden und der Text kann auch mit textout auf eine _feste_ position auf der Paintbox ausgeben werden. Wenn ich jetzt aber Tedit.left und Tedit.top verwende um den text mit textout auf die Canvas der paintbox zu positionieren funktioniert das nicht.
Ich denk mal das sind ja auch die Koordinaten auf der Form.
Wie bekomme ich nun die richtigen Koordinaten auf dem paintbox.canvas?
ich hoffe ich hab mich einigermassen verständlich ausgedrückt.
vieleicht geht alles auch viel einfacher ??
Danke für eure Hilfe
Gruss KH
-
- Beiträge: 489
- Registriert: Sa 5. Apr 2008, 09:37
- OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
- CPU-Target: 32Bit /64 Bit
- Wohnort: Nähe Freiburg i.Br.
hallo zusammen, hallo Theo,
alsoo, ich hab jetzt meine Componente von TCustomControl abgeleitet.
in einer proc lade ich ein Bild per:
self.Canvas.stretchDraw(rectangle1,image.Picture.bitmap);
danach erstelle ich im onClick Ereignis ein editfeld an der Cursorposition.
Bis hierhin funktioniert das wunderbar, bis auf eine Kleinigkeit.
Beim Erstellen des Editfeldes wird in der linken oberen ecke der canvas ein Feld in der Grösse des editfeldes und in der color der komponente gezeichnet, welches das geladene Bitmap an der Stelle überschreibt.
Mach ich da was falsch, oder muss ich irgendwo refeshen ?
EDIT:
wenn ich mit einem anderen Window über die Komponente fahre, wird das geladene Bild auch gelöscht
Danke für eure Hilfe
Gruss KH
alsoo, ich hab jetzt meine Componente von TCustomControl abgeleitet.
in einer proc lade ich ein Bild per:
self.Canvas.stretchDraw(rectangle1,image.Picture.bitmap);
danach erstelle ich im onClick Ereignis ein editfeld an der Cursorposition.
Bis hierhin funktioniert das wunderbar, bis auf eine Kleinigkeit.
Beim Erstellen des Editfeldes wird in der linken oberen ecke der canvas ein Feld in der Grösse des editfeldes und in der color der komponente gezeichnet, welches das geladene Bitmap an der Stelle überschreibt.
Mach ich da was falsch, oder muss ich irgendwo refeshen ?
EDIT:
wenn ich mit einem anderen Window über die Komponente fahre, wird das geladene Bild auch gelöscht

Danke für eure Hilfe
Gruss KH
Zuletzt geändert von khh am Sa 3. Mai 2008, 13:50, insgesamt 1-mal geändert.
-
- Beiträge: 489
- Registriert: Sa 5. Apr 2008, 09:37
- OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
- CPU-Target: 32Bit /64 Bit
- Wohnort: Nähe Freiburg i.Br.
@theo,
Funktioniert auch soweit, bis auf ein kurzes Flackern bei dem man sieht dass oben links besagtes Feld gezeichnet wird.
Was ist das, was zeichnet dieses feld in die linke ecke ?
Macht es vieleicht Sinn das Bild in einem stream zu speichern und daraus neu zu zeichnen. Ich denk mal dass nachladen fromfile zu langsam ist, oder ?
hab das Bild aus dem opendialog jetzt im OnpaintEvent "nachgeladen".Du solltest im OnPaint Event zeichnen.
Funktioniert auch soweit, bis auf ein kurzes Flackern bei dem man sieht dass oben links besagtes Feld gezeichnet wird.
Was ist das, was zeichnet dieses feld in die linke ecke ?
Macht es vieleicht Sinn das Bild in einem stream zu speichern und daraus neu zu zeichnen. Ich denk mal dass nachladen fromfile zu langsam ist, oder ?
Keine Ahnung.khh hat geschrieben: Was ist das, was zeichnet dieses feld in die linke ecke ?
Du solltest es erst in ein anderes Bitmap laden, und OnPaint jew. auf den Canvas pappen mit Canvas.Draw(0,0,BufferBitmap);khh hat geschrieben: Macht es vieleicht Sinn das Bild in einem stream zu speichern und daraus neu zu zeichnen. Ich denk mal dass nachladen fromfile zu langsam ist, oder ?
Gewöhn dich dran, dass der Canvas in diesem Fall eine flüchtige Sache ist die bei jedem Paint event bemalt werden muss.
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Du solltest in ein Buffer zeichnen. Das ist zwar eine mehrbelastung weil du ja erst in ein Buffer zeichnest und dann wieder raußkopierst aber es lohnt sich. Bei meinem TextEditor Beispiel arbeite ich ohne buffer weil es für ein einfaches Beispiel reicht, aber es ist zu langsam, darum flimmert es wenn ich z.b. den Cursor dort bewege. Such mal nach Buffer in:
http://www.delphipraxis.net" onclick="window.open(this.href);return false; weil du hier warscheinlich noch nicht viel in dieser Richtung finden wirst. Das nennt sich noch anders irgendwas mit "Doubel Buffer" oder so ist auch eine Eigenschaft von z.b. einem From oder einem Panel.
http://www.delphipraxis.net" onclick="window.open(this.href);return false; weil du hier warscheinlich noch nicht viel in dieser Richtung finden wirst. Das nennt sich noch anders irgendwas mit "Doubel Buffer" oder so ist auch eine Eigenschaft von z.b. einem From oder einem Panel.
MFG
Michael Springwald
Michael Springwald