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; type
_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; codepage: UINT; end; TGetTextLengthEx = GETTEXTLENGTHEX;
function Getpage(memo: TRichedit; caretpos: integer; var Allpage: integer): integer;
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; 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;
OldMap := SetMapMode(range.hdc, MM_TEXT); SendMessage(memo.Handle, EM_FORMATRANGE, 0, 0); try repeat range.rc := SaveRect; range.chrg.cpMin := LastChar; LastChar := SendMessage(memo.Handle, EM_FORMATRANGE, 0, Longint(@Range)); if (LastChar < maxlen) and (LastChar <> -1) then begin inc(AllPage); if LastChar<caretpos then inc(result); end; until (LastChar >= maxlen) or (LastChar = -1); finally SendMessage(memo.Handle, EM_FORMATRANGE, 0, 0); SetMapMode(range.hdc, OldMap); end; inc(result); inc(AllPage); end; end;
end. |