답변 감사하고요.
Tip을 보고 해보는데요...
잘 되지 않네요...
스크롤이 맨마지막으로 움직였을때의 스크롤메세지는 SB_BOTTOM아닌지요?
초보라서 이렇게 기찮게 해드리는군요. 죄송...
에러가 나는군요....
어떻게 해야될까요....??????
방법을 찾으려고 몇칠째 하고 있지만 알수가 없음....
제발 알려주세요....
수직 스크롤이 맨 마지막으로 이동했을때
'더이상 자료가 없습니다.'
라고 출력할려고 합니다.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
FOld: TWndMethod;
procedure Scroll(var Message: TWMScroll); message WM_VSCROLL;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
FOld := memo1.WindowProc;
memo1.WindowProc := Scroll;
end;
procedure TForm1.Scroll (var Message: TWMScroll);
begin
if Message.msg=SB_BOTTOM then ShowMessage('마지막입니다.');
FOld( Message);
end;
end.
그리고 MessageBox() 로 자료의 끝임을 알릴때
여러번 박스가 나타나므로 아래서는 Label2에 나타내었습니다
Label1 의 스크롤의 현재 위치입니다
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls;
type
TForm1 = class(TForm)
ListView1: TListView;
Label1: TLabel;
Label2: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ListView1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
end;
type
{$IFDEF WIN32}
WParameter = LongInt;
{$ELSE}
WParameter = Word;
{$ENDIF}
LParameter = LongInt;
var
Form1: TForm1;
OldWindowProc : Pointer;
implementation
{$R *.DFM}
function NewWindowProc(WindowHandle : hWnd;
TheMessage : WParameter;
ParamW : WParameter;
ParamL : LParameter): LongInt
{$IFDEF WIN32} stdcall; {$ELSE} ; export; {$ENDIF}
var
TheRangeMin: integer;
TheRangeMax: integer;
TheRange: integer;
begin
if (TheMessage = WM_VSCROLL) or (TheMessage = WM_NULL) then
begin
// 스크롤박스의 수직 최소, 최대 Range를 가져온다.
GetScrollRange(WindowHandle,
SB_VERT,
TheRangeMin,
TheRangeMax);
// 현재 스크롤바의 수직 위치를 알아낸다.
TheRange := GetScrollPos(WindowHandle,
SB_VERT);
Form1.Label1.Caption := Format('%d ~ %d : %d',
[TheRangeMin+1,
TheRangeMax+1,
TheRange+Form1.ListView1.VisibleRowCount]);
if (Form1.ListView1.VisibleRowCount+TheRange) = (TheRangeMax+1) then
Form1.Label2.Caption := '더이상 자료가 없습니다'
else
Form1.Label2.Caption := '';
end;
NewWindowProc := CallWindowProc(OldWindowProc,
WindowHandle,
TheMessage,
ParamW,
ParamL);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
itm: TListItem;
begin
// 아래는 다음처럼 바꾸어도 됩니다
// ListView1.Items.BeginUpdate;
SendMessageA(ListView1.Handle, WM_SETREDRAW, 0, 0);
try
ListView1.Items.Clear;
for i := 1 to 100 do
begin
itm := ListView1.Items.Add;
with itm do
begin
Caption := 'Item' + IntToStr(i);
SubItems.Add ('sub1.' + IntToStr(i));
SubItems.Add ('sub2.' + IntToStr(i));
end;
end;
finally
// 아래는 다음처럼 바꾸어도 됩니다
// ListView1.Items.EndUpdate;
SendMessageA(ListView1.Handle, WM_SETREDRAW, 1, 0);
end;
OldWindowProc := Pointer(SetWindowLong(ListView1.Handle,
GWL_WNDPROC,
LongInt(@NewWindowProc)));
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
SetWindowLong(ListView1.Handle,
GWL_WNDPROC,
LongInt(OldWindowProc));
end;
procedure TForm1.ListView1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
// 동작없는 메시지(WM_NULL)를 보낸다
PostMessage(ListView1.Handle, WM_NULL, 0, 0);
end;
end.