Autor Beitrag
ssb-blume
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 375
Erhaltene Danke: 7

XP, W7, W8
Deutschland
BeitragVerfasst: Mi 29.11.06 11:39 
Bestimmung der aktuellen Druckseite eines Memos / Richedits[meta]Drucker, Seite, Position, Cursor[/meta]

ausblenden volle Höhe Delphi-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:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
unit GetPageNumber;

Interface

uses ComCtrls, Windows, SysUtils, Classes, Printers, RichEdit;

const RichEditVersion = 2// dies bitte ändern, falls erforderlich:
  
type

// die folgenden Vereinbarungen sollten schon in Richedit stehen:
  _charrange = record
    cpMin: Longint;
    cpMax: LongInt;
  end;
  TCharRange = _charrange;
  CHARRANGE = _charrange;

  _formatrange = record
    hdc: HDC;
    hdcTarget: HDC;
    rc: TRect;
    rcPage: TRect;
    chrg: TCharRange;
  end;
  TFormatRange = _formatrange;
  FORMATRANGE = _formatrange;

  GETTEXTLENGTHEX = record
    flags: DWORD;              { flags (see GTL_XXX defines)       }
    codepage: UINT;            { code page for translation (CP_ACP for default,
                                 1200 for Unicode            }

  end;
  TGetTextLengthEx = GETTEXTLENGTHEX;

// und hier nun die Funktion:
  function Getpage(memo: TRichedit; caretpos: integer; var Allpage: integer): integer;

//Bedeutung der Parameter:
//  caretpos:  Position des Cursors (i.a. memo.selstart)
//  AllPage:   Gesamtseiten des Textes
//  result:    Aktuelle Seite, auf der der Kursor steht
//  memo:      Name der RichEdit-Komponente  
//
// der aktuell ausgewählte Drucker wird für diese Funktion verwendet, es wird aber
// nicht gedruckt (kann also ausgeschaltet bleiben)!
Implementation

function Getpage(memo: TRichedit; caretpos: integer; var Allpage: integer): integer;
var Range: TFormatRange;
    LastChar, MaxLen, LogX, LogY, OldMap: Integer;
    SaveRect: TRect;
    TextLenEx: TGetTextLengthEx;
begin
  result:=0;
  Allpage:=0;
  FillChar(Range, SizeOf(TFormatRange), 0);
  begin
    Range.hdc := 0;             // no target device!
    Range.hdcTarget := 0;
    LogX := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
    LogY := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
    if IsRectEmpty(memo.PageRect) then
    begin
      range.rc.right := Printer.PageWidth * 1440 div LogX;
      range.rc.bottom := Printer.PageHeight * 1440 div LogY;
    end else
    begin
      range.rc.left := memo.PageRect.Left * 1440 div LogX;
      range.rc.top := memo.PageRect.Top * 1440 div LogY;
      range.rc.right := memo.PageRect.Right * 1440 div LogX;
      range.rc.bottom := memo.PageRect.Bottom * 1440 div LogY;
    end;
    Range.rcPage := Range.rc;
    SaveRect := Range.rc;
    LastChar := 0;
    if RichEditVersion >= 2 then
    begin
      with TextLenEx do
      begin
        flags := GTL_DEFAULT;
        codepage := CP_ACP;
      end;
      MaxLen := memo.Perform(EM_GETTEXTLENGTHEX, WParam(@TextLenEx), 0);
    end else MaxLen := memo.GetTextLen;
    range.chrg.cpMax := -1;

    { ensure printer DC is in text map mode }
    OldMap := SetMapMode(range.hdc, MM_TEXT);
    SendMessage(memo.Handle, EM_FORMATRANGE, 00);    { flush buffer }
    try
      repeat
        range.rc := SaveRect;
        range.chrg.cpMin := LastChar;
        // only measured:
        LastChar := SendMessage(memo.Handle, EM_FORMATRANGE, 0, Longint(@Range));
        if (LastChar < maxlen) and (LastChar <> -1then
        begin             // next page
          inc(AllPage);
          if LastChar<caretpos then inc(result);
        end;
      until (LastChar >= maxlen) or (LastChar = -1);
    finally
      SendMessage(memo.Handle, EM_FORMATRANGE, 00);  { flush buffer }
      SetMapMode(range.hdc, OldMap);       { restore previous map mode }
    end;
    inc(result);
    inc(AllPage);
  end;
end;

end.



Ich hoffe, damit einigen Freuden geholfen zu haben.

_________________
Brain: an apparatus with which we think we think.


Zuletzt bearbeitet von ssb-blume am Fr 15.12.06 11:03, insgesamt 3-mal bearbeitet