Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Inhalt mehrerer Richedit auf eine Seite drucken (https://www.delphipraxis.net/73401-inhalt-mehrerer-richedit-auf-eine-seite-drucken.html)

Calle 17. Jul 2006 17:35


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

Flocke 17. Jul 2006 18:34

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 MSDN-Library durchsuchenEM_FORMATRANGE ansehen - das ist die Meldung, die eigentlich alles für dich erledigt.

Calle 4. Aug 2006 10:53

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...^^

TBx 4. Aug 2006 11:26

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

Flocke 4. Aug 2006 12:28

Re: Inhalt mehrerer Richedit auf eine Seite drucken
 
Oder nimm die folgende Routine.
Delphi-Quellcode:
{ 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;
Beispielcode:
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 00:16 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