항상 질문만 하는 초보개발자 입니다.
dbgrid에서 사용자가 하나의 레코드를 선택한 상태라 가정하겠습니다.
물론 selectrow는 true로 설정했구요
이상태에서 상하 스코롤바를 옴직이면 사용자가 선택했던 레코드가 포커스를
잃고 보여진 그리드상의 맨위나 맨 아래 레코드로 포커스가 이동하는 현상이
발생하는데, 제가 원하는 것은 스코롤을 하더라도 사용자가 선택한
레코드에 포커스가 유지되도록 하고 싶은데 어떻게 해야 할지가 막막합니다.
한수부탁드립니다.
감사합니다.
어렵네요.
구현은 해보았는데
selectrow는 true로 설정하구,하나의 레코드를 선택한 상태에서
상하 스코롤바를 움직이면 사용자가 선택했던 레코드가 포커스 잃지않게 보여진 상태에서 그리드가 상하로 움직이게 하긴했는데
단점은 최상하일경우 한칸더 움직이면 공란이 생기므로 바로 전칸에서 멈추고
더 이상으로 움직이면 포커스는 현화면의 밖으로 가는것을 막아야만 했습니다.
오류를 막아보세요, 이건 그냥 참조로해보세요.
unit Unit1;
...
private
{ Private declarations }
SROW : integer;
procedure MOUSEWHEELMessage(var Msg: TMsg; var Handled: Boolean);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage:= MOUSEWHEELMessage;
end;
procedure TForm1.MOUSEWHEELMessage(var Msg: TMsg; var Handled: Boolean);
begin
if Msg.Message = WM_MOUSEWHEEL then begin
if ActiveControl = TControl(DBgrid1) then begin
SROW := TStringGrid(DBGrid1).Row;
if Msg.wParam > 0 then begin
SendMessage(DBGrid1.Handle,WM_VSCROLL,SB_LINEUP,0);
inc(SROW); inc(SROW);
end
else if Msg.wParam < 0 then begin
SendMessage(DBGrid1.Handle,WM_VSCROLL,SB_LINEDOWN,0);
Dec(SROW); Dec(SROW);
end;
if TStringGrid(DBGrid1).RowCount <= SROW then
SROW := TStringGrid(DBGrid1).RowCount-1
else if SROW <= 0 then SROW := 1;
TStringGrid(DBGrid1).Row := SROW;
end;
end;
end;