![]() |
Inhalt mehrerer Richedit auf eine Seite drucken
Nach langem Grübeln und ner menge Ideen die aber allesamt wahrscheinlich nicht funktionieren muss ich mich mal wieder an die Könner wenden...
Folgendes Problem: Ich habe ein Program mit dem man Karteikarten erstellen, speichern, abfragen etc. kann. Nun will ich diese Karteikarten aber auch asudrucken können. Dabei möchte ich aber nicht so papierverschwenden vorgehen und für jede Karte ein Blatt aufwenden. :mrgreen: Also stellt sich die Frage wie man die Fragen bzw. die Antworten dem Blatt so anpasst dass man davon mehrere auf eine Seite bringen kann. (Übrigens stehen die Fragen dann alle auf einer Seite und die Antworten passend auf der anderen Seite...aber das sollte nicht sonderlich schwer werden) Bisschen Wissen zum Programmaufbau: Man erstellt eine neue Karteikarte und gibt eine Headline in ein Edit ein, schreibt die Frage in ein Richedit und die Antwort in ein 2. Richedit. Das ganze wird dann als Record zusammen mit ein paar anderen Infos gespeichert und dann in ein dynamisches Array hineingelegt. Folgende Lösungsansätze hatte ich schon: 1.) Ich lese die 1. Zeile der 1.Frage aus und schreibe sie in ein unsichtbares 3. Edit, lese die 1. Zeile der 2.Frage aus und schreibe sie mit einem ausreichenden Abstand ebenfalls in das unsichtbare 3. Edit (Auf der selben Zeile) Problem: Wie krieg ich den nötigen Abstand raus, Wie krieg ich einen gleichmäßigen Abstand für alle Zeilen zustande 2.) Ich definiere mit PageRect die zu bedruckende Fläche (die dann wohl standardisiert ist ^^) für die Frage und setz die dann nebeneinander / untereinander Problem: Wie bring ich ihm mehrere zu bedruckede Flächen mit verschiedenem Inhalt bei? (Man müsste ja zwischendurch drucken damit man ihm neuen Inhalt für ein neues PageRect geben kann oder nicht?) Tja...und ich weiss irgendwie nicht so recht wie ich das ädequat lösen soll... Ich hatte auch schon die spontane Idee die Inahlte der RichEdits in Grafik umzuformatieren dass dann auf einem Canvas auszurichten und dann quasi als Bild auszudrucken aber da hab ich nun wirklich gar keine Ahnung wie ich das machen soll... Ich hoffe ihr könnt mir helfen :-D |
Re: Inhalt mehrerer Richedit auf eine Seite drucken
Schau dir mal die Routine TJvCustomRichEdit.Print von den Jedis in JvRichEdit.pas an (bei mir in Zeile 3573). Im Grunde musst du so eine Prozedur nur nachbilden, dabei aber das BeginDoc und EndDoc weglassen - das musst du ja außen herum setzen in deinem Code machen. Dann benutzt du für jede Karteikarte ein anderes PageRect (kannst du der Routine ggf. auch als Parameter übergeben).
Zum besseren Verständnis solltest du dir die Dokumentation zu ![]() |
Re: Inhalt mehrerer Richedit auf eine Seite drucken
Ich muss ehrlich gestehen..ich habs versucht aber nicht hingekriegt. :(
Zwischenzeitlich ist mir dann eine Idee gekommen wie ich das Problem lösen kann: eine neue Form erzeugen mit mehreren Richedits, diese füllen und dann die ganze Form ausdrucken... Aber irgendwie gefällt mir das noch nicht recht...es ist einfach unschön... Darum wäre ich einem Code-Beispiel oder so nicht abgeneigt...^^ |
Re: Inhalt mehrerer Richedit auf eine Seite drucken
Hallo!
Das ist ein klassisches Beispiel für den Einsatz eines Reportgenerators. Ist Rave bei der Personal Edition mit drin? Gruß onlinekater |
Re: Inhalt mehrerer Richedit auf eine Seite drucken
Oder nimm die folgende Routine.
Delphi-Quellcode:
Beispielcode:
{ Druckt den Inhalt des angegebenen RichEdit-Fensters ab der Zeichenposition
"FromPos" in das angegebene Rechteck. Liefert die Zeichenposition des ersten nicht mehr gedruckten Zeichens zurück. } const PageRect_Twips = 144000; PageRect_MM = 2540; PageRect_Printer = 0; function PrintRichEditIntoRect(RichEditHandle: HWND; const PageRect: TRect; Scaling: Integer = PageRect_Printer; FromPos: Integer = 0): Integer; var Range: TFormatRange; MM: Integer; pho, lpx: TPoint; begin Range.hdc := Printer.Handle; Range.hdcTarget := Range.hdc; lpx.x := 100 * GetDeviceCaps(Range.hdc, LOGPIXELSX); lpx.y := 100 * GetDeviceCaps(Range.hdc, LOGPIXELSY); // In Druckerkoordinaten umwandeln falls nötig if Scaling <> PageRect_Printer then begin Range.rc.Left := MulDiv(PageRect.Left, lpx.x, Scaling); Range.rc.Top := MulDiv(PageRect.Top, lpx.y, Scaling); Range.rc.Right := MulDiv(PageRect.Right, lpx.x, Scaling); Range.rc.Bottom := MulDiv(PageRect.Bottom, lpx.y, Scaling); // Druckoffset anpassen pho.x := GetDeviceCaps(Range.hdc, PHYSICALOFFSETX); pho.y := GetDeviceCaps(Range.hdc, PHYSICALOFFSETY); OffsetRect(Range.rc, -pho.x, -pho.y); end else Range.rc := PageRect; // In Twips umwandeln Range.rc.Left := MulDiv(Range.rc.Left, 144000, lpx.x); Range.rc.Top := MulDiv(Range.rc.Top, 144000, lpx.y); Range.rc.Right := MulDiv(Range.rc.Right, 144000, lpx.x); Range.rc.Bottom := MulDiv(Range.rc.Bottom, 144000, lpx.y); Range.rcPage := Range.rc; Range.chrg.cpMin := FromPos; Range.chrg.cpMax := -1; MM := SetMapMode(Printer.Handle, MM_TEXT); try SendMessage(RichEditHandle, EM_FORMATRANGE, 0, 0); Result := SendMessage(RichEditHandle, EM_FORMATRANGE, 1, Integer(@Range)); finally SendMessage(RichEditHandle, EM_FORMATRANGE, 0, 0); SetMapMode(Printer.Handle, MM); end; end;
Delphi-Quellcode:
procedure TForm1.Print1Click(Sender: TObject);
var h: THandle; rc: TRect; pp: Integer; begin h := RichEdit1.Handle; Printer.BeginDoc; try pp := 0; rc := Rect(10, 10, 100, 100); pp := PrintRichEditIntoRect(h, rc, PageRect_MM, pp); rc := Rect(110, 110, 200, 200); pp := PrintRichEditIntoRect(h, rc, PageRect_MM, pp); rc := Rect(10, 110, 100, 200); pp := PrintRichEditIntoRect(h, rc, PageRect_MM, pp); rc := Rect(110, 10, 200, 100); pp := PrintRichEditIntoRect(h, rc, PageRect_MM, pp); Printer.EndDoc; except Printer.Abort; raise; end; MessageDlg('Ausdruck erfolgte bis Zeichen ' + IntToStr(pp), mtInformation, [mbOk], 0); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:24 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