Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Probleme Drucken mit RichEdit HILFEEE


patrick dee - Mi 30.10.02 14:09
Titel: Probleme Drucken mit RichEdit HILFEEE
hi

habe zum drucken mit Seitenrand für eine RichEdit diesen Code gefunden.

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.Button2Click(Sender: TObject); 
var 
presX, presY: Integer; 
Begin 
with richedit1 do begin 
plaintext := true; 
lines.loadfromfile( changefileext( application.exename, '.DPR' )); 
presX := GetDeviceCaps( printer.handle, LOGPIXELSX ); 
presY := GetDeviceCaps( printer.handle, LOGPIXELSY ); 
with pagerect do begin 
left := presX; // 1 inch left margin 
top := 3 * presY div 2; // 1.5 inch top margin 
right := Printer.PageWidth - 3 * presX div 4; // 0.75 inch right 
margin 
bottom := Printer.PageHeight - presY; // 1 inch bottom margin 
end; 
Print('Testjob'); 
end; 
End;

Nur ich kriege es nicht hin das oben und links ein korekter Seitenrand
bleibt. Mit diesem Beispiel wird mitten in einem Blatt gedruckt.

Kann mir jemand Helfen oder hat evtl eine bessere Idee wie ich das Lösen kann. Brauche oben und linkes einen Rand damit man die Seiten nach dem Drucken auch Lochen kann ohne den Text zu durchbohren.

gruß

patrick


Sven - Mi 30.10.02 16:51

Ich verwende ein TRxRichEdit. Um das Drucken mit Rändern zu ermöglichen, mußte ich dieses anpassen. Nei druckt er ohne Probleme.
Li, Ob, Re und Un sind Die Ränder in Twips.


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
procedure TRxCustomRichEdit.Print(const Caption: string;
                                  const Li,Ob,Re,Un: integer);  //by SL
var
  Range: TFormatRange;
  LastChar, MaxLen, LogX, LogY, OldMap: Integer;
  SaveRect       : TRect;
  TextLenEx      : TGetTextLengthEx;
  i, j                 : integer;
begin
  FillChar(Range, SizeOf(TFormatRange), 0);
  with Printer, Range do begin
    Title := Caption;
    BeginDoc;
    hdc := Handle;
    hdcTarget := hdc;
    LogX := GetDeviceCaps(Handle, LOGPIXELSX);
    LogY := GetDeviceCaps(Handle, LOGPIXELSY);
    if IsRectEmpty(PageRect) then begin
      rc.left   := Li;
      rc.top    := Ob;
      rc.right  := MulDiv(PageWidth,1440,LogX) - Re;
      rc.bottom := MulDiv(PageHeight,1440,LogY) - Un;
    end
    else begin
      rc.left := MulDiv(PageRect.Left,1440,LogX) - Li;
      rc.top := MulDiv(PageRect.Top,1440,LogY) - Ob;
      rc.right := MulDiv(PageRect.Right,1440,LogX) - Re;
      rc.bottom := MulDiv(PageRect.Bottom,1440,LogY) - Un;
    end;
    rcPage := rc;
    SaveRect := rc;
    LastChar := 0;
    if RichEditVersion >= 2 then begin
      with TextLenEx do begin
        flags := GTL_DEFAULT;
        codepage := CP_ACP;
      end;
      MaxLen := Perform(EM_GETTEXTLENGTHEX, WParam(@TextLenEx), 0);
    end
    else MaxLen := GetTextLen;
    chrg.cpMax := -1;
    { ensure printer DC is in text map mode }
    OldMap := SetMapMode(hdc, MM_TEXT);
    SendMessage(Self.Handle, EM_FORMATRANGE, 0, 0);    { flush buffer }
    try
      repeat
        rc := SaveRect;
        chrg.cpMin := LastChar;
        LastChar := SendMessage(Self.Handle, EM_FORMATRANGE, 1, Longint(@Range));
        if (LastChar < MaxLen) and (LastChar <> -1) then NewPage;
      until (LastChar >= MaxLen) or (LastChar = -1);
      EndDoc;
    finally
      SendMessage(Self.Handle, EM_FORMATRANGE, 0, 0);  { flush buffer }
      SetMapMode(hdc, OldMap);       { restore previous map mode }
    end;
  end;
end;


Ich hoffe es hilft.

Gruß Sven


Raphael82 - Do 31.10.02 01:46

Du kannst in jedem TRichEdit, TMemo oder welche Komponente auch immer du verwenden magst deine Seitenränder hinbekommen!
Svens Lösungsansatz ist doch recht umständlich, das geht auch um einiges kürzer..
Habe glaube ich bei http://www.delphi-source.de neulich ein Tutorial darüber gesehen. Die Tutorials dort sind sehr gut, also schau einfach mal rein!

Raphael


patrick dee - Do 31.10.02 06:54

Hi Seven

danke für deiene hilfe. Aber was mich noch interesieren würde ob das so wie du geschrieben hast bei dir funktioniert. Glaube ich kaum den bei mir
geht da gar nix. Delphi 3 Antwortet mit tausend Fehlermeldungen das ist es wohl nicht. Und was soll bei ButtonPrint On click passieren ???????
Da steht gor nx dazu.

HAT DEN NIEMAND EINE LÖSUNG FÜR MICH DIE AUCH FUNKTIONIERT !!!

Auch der Tip von Raphael habe ich berücksichtigt. Aber das ging auch nicht.

gruß

patrick dee


Raphael82 - Do 31.10.02 11:12

Also gut, hier mal ein paar Grundlagen, welche so auch auch Delphi-Source, dem von mir oben angegebenen Linnk zu finden sind!
Also, zuerstmal sollte man wissen, dass standardmässig beim drucken in Pixel gerechnet wird. Da dies jedoch nicht geräteunabhängig ist solltest du die Einheiten umstellen, hier in 1/10mm:


Quelltext
1:
SetMapMode(Printer.Canvas.Handle, MM_LOMETRIC);                    


Was nun ungewönlich ist, aber wichtig, ist, dass sich nun der Koordinatenursprung links-oben befindet! Will man also eine Zeile mit 2cm Rand von links und oben drucken würde das so aussehen:

Quelltext
1:
printer.Canvas.TextOut(20, -20, 'Ich stehe mit je 2cm Rand da!');                    


Dazu solltest du dir noch folgende Methoden genauer ansehen (delphihilfe, sdk, Win32 Developers Reference,...)
TPrinters, SetViewPortOrgEx, SetViewPortExtEx, SetWindowOrgEx, SetWindowExtEx,SetMapMode,GetDeviceCaps, Canvas..

Ausserdem empfehle ich dir nochmal das Drucken Tutorial bei
http://www.delphi-source.de. Nicht bei den Programmiertips nachsehen, sondern bei Tutorials!
Das Drucken ist nicht die leichteste Übung in Delphi, wenn man es richtig machen will!

Raphael[/url][/list]


Sven - Do 31.10.02 12:59

patrick dee hat folgendes geschrieben:
... Aber was mich noch interesieren würde ob das so wie du geschrieben hast bei dir funktioniert. Glaube ich kaum den bei mir
geht da gar nix. Delphi 3 Antwortet mit tausend Fehlermeldungen das ist es wohl nicht. Und was soll bei ButtonPrint On click passieren ??????? ...


Also zum einen habe ich gesagt, daß es sich um einen Auszug aus meiner TRxRichEdit handelt, die ich in einigen Punkten selber anpassen mußte und zum anderen funktioniert es bei mir absolut einwandfrei, sonst hätte ich wohl kaum den Auszug gepostet.