Autor |
Beitrag |
galagher
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Fr 20.08.04 16:28
Hallo Leute!
Ich habe ein TImage und möchte nun Text, der in einem TEdit steht, ins Image als Teil des Bildes kopieren, das gleiche soll auch mit einem Memo oder Label gehen. Wie kopiere ich nur den Text ohne den weissen "Hintergrund" des TEdits in Image1?
Bis jetzt habe ich nur das hier, das Ergebnis ist aber geradezu peinlich:
Delphi-Quelltext 1: 2:
| Image1.Canvas.CopyRect(Rect(0,0,Edit1.Width,Edit1.Height), Canvas, Rect(0, 0, Edit1.Width*2,Edit1.Height*2)); |
Das geht doch besser, oder?
Moderiert von Klabautermann: Topic aus VCL (Visual Component Library) verschoben am Fr 20.08.2004 um 16:34
//Edit: Das wird alles nix. Hab's gelöscht! Trotzdem vielen Dank!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Zuletzt bearbeitet von galagher am Sa 21.08.04 08:49, insgesamt 1-mal bearbeitet
|
|
umpani
      
Beiträge: 389
|
Verfasst: Fr 20.08.04 18:05
Versuch es mal mit
Delphi-Quelltext 1: 2: 3:
| Image1.Canvas.font := edit1.font; image1.canvas.brush.style := bsclear; image1.casvas.textout(100,100,edit1.caption); |
so aus dem Kopf;
Gruß Benno
_________________ Lernen, ohne zu denken, ist eitel; denken, ohne zu lernen, ist gefährlich. Konfuzius
|
|
MartinPb
      
Beiträge: 698
|
Verfasst: Fr 20.08.04 18:16
Also Edits oder Memos in ein Bitmap (bzw. Canvas) reinkopieren ist nicht möglich, denn die haben kein Canvas. Wobei "nicht möglich" nicht bedeutet, daß es absolut unmöglich ist, denn irgendwie ist immer alles möglich. Ich spreche aber von der Normalität.
Was man aber machen kann, und hier fange ich mal mit Edits an, ist den reinen Text zu übertragen. Allerdings, wenn das eine Rolle spielt, dann kannst du auch auch den ClientRect Bereich übernehmen. Wenn ich also einen Text aus einem Edit-Feld in ein Canvas übertragen müßte, dann würde ich es so machen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| var r: TRect; f: TFont; t: String; x, y: Integer; begin f := Edit1.Font; r := Edit1.ClientRect; t := Edit1.Text;
x := 20; y := 50; with r do r := Rect(Left + x, Top + y, Right + x, Bottom + y);
Form1.Canvas.Font := f; Form1.Canvas.Brush.Style := bsClear; Form1.Canvas.TextRect(r, x, y, t);
end; |
Das Beispiel zeichnet den Text auf Form1 Canvas.
Bei ListBox oder Memo geht das fast genauso. Auch die haben Rect Bereiche. Alles was außerhalb ist hat einen Rect Bereich der 0 breit und 0 hoch ist. Man müß die einzelnen Zeilen für sich rauskopieren.
_________________ Gruß
Martin
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Sa 21.08.04 10:49
Also ich hab' doch wieder begonnen, aber jetzt klapt das Drucken nicht - wird winzig klein(??)!
Delphi-Quelltext 1: 2: 3: 4:
| Printer.BeginDoc; Printer.Canvas.CopyRect(Rect(0, 0, Image1.Width, Image1.Height), Image1.Canvas, Rect(0, 0, Image1.Width, Image1.Height)); Printer.EndDoc; |
Das Ganze soll ein Prog zum CD-Cover-Drucken werden, und da sollte es schon drucken können...
Danke!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
umpani
      
Beiträge: 389
|
Verfasst: Sa 21.08.04 11:02
Schau dir mal
SETMAPMODE
an.
Aber vorsicht, der Ursprung des Koordinatensystems liegt dann nicht mehr links unten, sondern links oben.
Gruß benno
_________________ Lernen, ohne zu denken, ist eitel; denken, ohne zu lernen, ist gefährlich. Konfuzius
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Sa 21.08.04 11:27
umpani hat folgendes geschrieben: | Schau dir mal
SETMAPMODE
an. |
Das klappt aber leider auch nicht. Der Ausdruck bleibt ca. 1,5 x 1,5 cm klein. Wenn ich in eine Datei speichere und ShellExecute mit "print" aufrufe, wird der Ausdruck zu gross. Hat jemand eine Idee, wie ich 1:1 drucken kann? Danke!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
umpani
      
Beiträge: 389
|
Verfasst: Sa 21.08.04 11:55
galagher hat folgendes geschrieben: | Also ich hab' doch wieder begonnen, aber jetzt klapt das Drucken nicht - wird winzig klein(??)!
Delphi-Quelltext 1: 2: 3: 4:
| Printer.BeginDoc; Printer.Canvas.CopyRect(Rect(0, 0, Image1.Width, Image1.Height), Image1.Canvas, Rect(0, 0, Image1.Width, Image1.Height)); Printer.EndDoc; |
Das Ganze soll ein Prog zum CD-Cover-Drucken werden, und da sollte es schon drucken können...
Danke! |
Wenn du das so lässt, kann das ja auch nicht klappen.
Wenn Du z.B.
Delphi-Quelltext 1:
| SetMapMode(Printer.Canvas.Handle, MM_LOMETRIC); |
stellst Du ja die Einheit des Canvas um.
Wenn ich mal annehme, dass Dein Image 500x500 pix groß ist und du es einfach so hineinkopierst, dann findet eine Umrechnung statt. Bei <b> MM_Lometric</b> wir jeder Pixel nur 0.1 mm breit. Also sind 500 Pixel im Ausdruck nur 5 cm breit. Ich glaube aber, dass ein CD Cover ca. 12 cm im QUadrat misst. Entsprechend mußt du also dein CopyRect anpassen.
Gruß Benno
_________________ Lernen, ohne zu denken, ist eitel; denken, ohne zu lernen, ist gefährlich. Konfuzius
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Sa 21.08.04 20:07
umpani hat folgendes geschrieben: |
Wenn du das so lässt, kann das ja auch nicht klappen.
Wenn Du z.B.
Delphi-Quelltext 1:
| SetMapMode(Printer.Canvas.Handle, MM_LOMETRIC); |
stellst Du ja die Einheit des Canvas um. |
Danke für deine Antwort, aber ich kapier das nicht. Ich hab jetzt
Delphi-Quelltext 1: 2: 3: 4: 5:
| Printer.BeginDoc; SetMapMode(Printer.Canvas.Handle, MM_LOMETRIC); Printer.Canvas.CopyRect(Rect(0, 0, Image1.Width, Image1.Height), Image1.Canvas, Rect(0, 0, Image1.Width, Image1.Height)); Printer.EndDoc; |
und es ist immer noch nur ca. 1,5 cm gross. Muss man da MM_LOMETRIC*12 (oder was auch immer) angeben, oder Image1.Width*12 oder so? Ich krieg das nicht hin!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
umpani
      
Beiträge: 389
|
Verfasst: So 22.08.04 00:01
galagher hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4:
| Printer.BeginDoc; Printer.Canvas.CopyRect(Rect(0, 0, Image1.Width, Image1.Height), Image1.Canvas, Rect(0, 0, Image1.Width, Image1.Height)); Printer.EndDoc; |
|
Nein, Du mußt Dein copyRect anpassen. z.B. so
Delphi-Quelltext 1: 2: 3:
| Printer.Canvas.CopyRect(Rect(0, 0, 1200, 1200), 12cm x 12 cm ausgeht Image1.Canvas, Rect(0, 0, Image1.Width, Image1.Height)); |
Gruß Umpani
PS. Denk an den versetzten Ursprung des Koordinatenkreuzes - siehe oben
_________________ Lernen, ohne zu denken, ist eitel; denken, ohne zu lernen, ist gefährlich. Konfuzius
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: So 22.08.04 09:35
umpani hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3:
| Printer.Canvas.CopyRect(Rect(0, 0, 1200, 1200), 12cm x 12 cm ausgeht Image1.Canvas, Rect(0, 0, Image1.Width, Image1.Height)); |
|
Tut mir ja leid, aber auch das klappt nicht. Ich habe also
Delphi-Quelltext 1: 2: 3: 4: 5:
| Printer.BeginDoc; SetMapMode(Printer.Canvas.Handle, MM_LOMETRIC); Printer.Canvas.CopyRect(Rect(0, 0, 1200, 1200), Image1.Canvas, Rect(0, 0, Image1.Width, Image1.Height)); Printer.EndDoc; |
und erhalte trotzdem nur einen cm-grossen Ausdruck. Wenn ich statt "Image1.Width" "1200" angebe, erhalte ich eine 12cm lange Linie am oberen Blattrand. Und was es mit dem Koordinatenkreuz auf sich hat - nein, ich blicke nicht durch. Ich zitiere mal aus der Delphi-Hilfe: "Das Ausdrucken von Pixelgrafiken aus einer Delphi Anwendung heraus ist eine einfache Angelegenheit. ..." Sieht aber nicht so aus...
Bitte um ein praktisches Beispiel, ich komm so nicht weiter! Danke!!! 
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
umpani
      
Beiträge: 389
|
Verfasst: So 22.08.04 10:15
Da Koordinatenkreuz bei SetMapMode bedeutet, dass der x,y Ursprung links oben ist (Anstatt wie sonst üblich links unten.
wenn du also eine linie von links oben nach rechts unten zeichne willst:
Delphi-Quelltext 1: 2:
| moveto(0,0) lineto(100,-100); |
Also muß alles was du unterhalb der oberen Kante zeichnen willst einen negativen y-Wert haben.
Delphi-Quelltext 1: 2:
| Printer.Canvas.CopyRect(Rect(0, 0, 1200, -1200), Image1.Canvas, Rect(0, 0, Image1.Width, Image1.Height)); |
Gruß Benno
_________________ Lernen, ohne zu denken, ist eitel; denken, ohne zu lernen, ist gefährlich. Konfuzius
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: So 22.08.04 10:43
umpani hat folgendes geschrieben: | Da Koordinatenkreuz bei SetMapMode bedeutet, dass der x,y Ursprung links oben ist (Anstatt wie sonst üblich links unten. |
Danke, jetzt klappt's endlich! Und wenn man
Delphi-Quelltext 1:
| Image1.Picture.Bitmap.PixelFormat := pf32Bit; |
angibt, wird die Qualität besser! Danke nochmals für die Hilfe!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
|