Autor Beitrag
patrick dee
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 311

Win 98SE, WinXP
D3,D6
BeitragVerfasst: Mi 30.10.02 14:09 
hi

habe zum drucken mit Seitenrand für eine RichEdit diesen Code gefunden.
ausblenden 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

_________________
Glauben heißt nichts wissen ...
Sven
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 314


D6 Ent, K3 Pro (patched)
BeitragVerfasst: 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.

ausblenden volle Höhe 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

_________________
MDK 9.1, Kernel 2.4.21, KDE 3.1 Kylix 3 Pro (patched), nutze aber auch Windows
Raphael82
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67



BeitragVerfasst: 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 www.delphi-source.de neulich ein Tutorial darüber gesehen. Die Tutorials dort sind sehr gut, also schau einfach mal rein!

Raphael

_________________
Share your knowledge to receive perfection!
patrick dee Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 311

Win 98SE, WinXP
D3,D6
BeitragVerfasst: 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

_________________
Glauben heißt nichts wissen ...
Raphael82
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67



BeitragVerfasst: 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:

ausblenden 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:
ausblenden 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
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]

_________________
Share your knowledge to receive perfection!
Sven
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 314


D6 Ent, K3 Pro (patched)
BeitragVerfasst: 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.

_________________
MDK 9.1, Kernel 2.4.21, KDE 3.1 Kylix 3 Pro (patched), nutze aber auch Windows