AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Inhalt mehrerer Richedit auf eine Seite drucken
Thema durchsuchen
Ansicht
Themen-Optionen

Inhalt mehrerer Richedit auf eine Seite drucken

Ein Thema von Calle · begonnen am 17. Jul 2006 · letzter Beitrag vom 4. Aug 2006
Antwort Antwort
Calle

Registriert seit: 13. Feb 2006
Ort: Teltow
24 Beiträge
 
Delphi 2005 Personal
 
#1

Inhalt mehrerer Richedit auf eine Seite drucken

  Alt 17. Jul 2006, 18:35
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.
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
" Si tacuisses, philosophus mansisses."
(Wenn du geschwiegen hättest, wärst du ein Philosoph geblieben)
Boethius, Trost der Philosophie, II, 7.
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: Inhalt mehrerer Richedit auf eine Seite drucken

  Alt 17. Jul 2006, 19:34
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.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Calle

Registriert seit: 13. Feb 2006
Ort: Teltow
24 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Inhalt mehrerer Richedit auf eine Seite drucken

  Alt 4. Aug 2006, 11:53
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...^^
" Si tacuisses, philosophus mansisses."
(Wenn du geschwiegen hättest, wärst du ein Philosoph geblieben)
Boethius, Trost der Philosophie, II, 7.
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.891 Beiträge
 
Delphi 12 Athens
 
#4

Re: Inhalt mehrerer Richedit auf eine Seite drucken

  Alt 4. Aug 2006, 12:26
Hallo!
Das ist ein klassisches Beispiel für den Einsatz eines Reportgenerators.

Ist Rave bei der Personal Edition mit drin?

Gruß

onlinekater
Thomas Breitkreuz
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: Inhalt mehrerer Richedit auf eine Seite drucken

  Alt 4. Aug 2006, 13:28
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;
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:43 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