Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

 DBGrid1.Datasource.Dataset.EnableControls;

end;

{*Данный пример позволит вам установить закладку изатем найти ее в списке выбранных записей компонента DBGrid.*}

//Устанавливаем закдадку

procedure TForm1.GetBookMarkClick(Sender: TObject);

begin

 Bookmark1:= DBGrid1.Datasource.Dataset.GetBookmark;

end;

//Освобождаем
закладку

procedure TForm1.FreeBookmarkClick(Sender: TObject);

begin

 if assigned(Bookmark1) then begin

DBGrid1.Datasource.Dataset.FreeBookmark(Bookmark1);

Bookmark1:= nil;

 end;

end;

//Испольуем метод Find для установления позиции

//записи-закладки в списке выбранных записей компонента DBGrid

procedure TForm1.FindClick(Sender: TObject);

begin

 if assigned(Bookmark1) then begin

if DBGrid1.SelectedRows.Find(TBookMarkStr(Bookmark1),z) then showmessage(inttostr(z));

 end;

end;

end.

Вертикальная полоса прокрутки Dbgrid

Delphi 1

Это небольшое исправление к исходному коду VCL, позволяющее поддерживать перемещение по таблице с помощью изменения позиции движка вертикальной полосы прокрутки.

(Примечание: это работает только с таблицами Paradox и BDE. Для использования этого кода с другими таблицами/движками вам необходимо заменить DBIGetSeqNo на функцию, надежно возвращающую текущую позицию записи вне зависимости от того, использует ли таблица индекс или нет.)

В DBGRID.PAS измените две следующих процедуры:

procedure TCustomDBGrid.UpdateScrollBar;

var

 Pos: Integer;

 mPos, mMax: longint;

begin

 if FDatalink.Active and HandleAllocated then

with FDatalink.DataSet do begin

UpdateCursorPos;

if (DBIGetSeqNo(Handle,mPos) = DBIERR_NONE) then begin

mMax := RecordCount;

while mMax > 1000 do begin

mMax := mMax div 10;

mPos := mPos div 10;

end;

SetScrollRange(Self.Handle, SB_VERT, 1, mMax, False);

end else begin

if BOF then mPos := 0

else if EOF then mPos := 4

else mPos := 2;

SetScrollRange(Self.Handle, SB_VERT, 0, 4, False);

end; (**)

if GetScrollPos(Self.Handle, SB_VERT) <> mPos then

SetScrollPos(Self.Handle, SB_VERT, mPos, True);

 end;

end;

procedure TCustomDBGrid.WMVScroll(var Message: TWMVScroll);

var

 mMin, mMax: integer;

 RecCount, RecNo, NewRecNo: longint;

begin

 if not AcquireFocus then Exit;

 if FDatalink.Active then

with Message, FDataLink.DataSet, FDatalink do

case ScrollCode of

SB_LINEUP: MoveBy(-ActiveRecord - 1);

SB_LINEDOWN: MoveBy(RecordCount - ActiveRecord);

SB_PAGEUP: MoveBy(-VisibleRowCount);

SB_PAGEDOWN: MoveBy(VisibleRowCount);

SB_THUMBPOSITION:

if (DBIGetSeqNo(Handle,RecNo) = DBIERR_NONE) then begin

GetScrollRange(self.Handle, SB_VERT, mMin, mMax);

NewRecNo := Pos*(FDataLink.DataSet.RecordCount div mMax);

MoveBy(NewRecNo-RecNo);

end else case Pos of

0: First;

1: MoveBy(-VisibleRowCount);

2: Exit;

3: MoveBy(VisibleRowCount);

4: Last;

end;

SB_BOTTOM: Last;

SB_TOP: First;

 end;

end;

Имейте

в виду, что из-за небольшой ошибки в VCL (MoveBy использует integer-параметр вместо longint), могут быть проблемы с большими таблицами (RecordCount>MaxInt). Объяснение этому факту я нашел в журнале Delphi Magazine. Для больших таблиц вы должны заменить вызовы MoveBy на DBISetToSeqNo или DBIGetRelativeRecord. Не забудьте после данного вызова вызвать Resnyc([]) или Refresh!

Поделиться с друзьями: