![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как DBGrid отображает несколько записей, не меняя RecNo датасета?
TheEd © (2007-11-29 06:36:00)Интересен один вопрос:
для того, чтобы заполнить таблицу данными, DBGrid у назначенного DataSource.DataSet не меняет RecNo. Как же он получает записи для отображения при начальной прорисовке или прокрутке?
Anatoly Podgoretsky (2007-11-29 11:50:00) [1]> ЮЮ (29.11.2007 11:30:06) [6]
Массонский заговор.
ЮЮ (2007-11-29 11:30:00) [2]> [5] Anatoly Podgoretsky © (29.11.07 11:24)
> > ЮЮ (29.11.2007 10:20:04) [4]
>
> Так грид знает что делает :-)
и DataSet знает, что его "делают", но вида при этом не показывает.
Anatoly Podgoretsky (2007-11-29 11:24:00) [3]> ЮЮ (29.11.2007 10:20:04) [4]
Так грид знает что делает :-)
ЮЮ (2007-11-29 10:20:00) [4]> Ну если быть точным, то по записям в буфере.
В OnDraw... грида я могу получать данные непосредственно из отображаемого DataSeta.
А в буфере они или нет, одна строка в буфере или несколько, дело десятое. Важно то, что
DataSeta скроллируется, однако без побчных эффектов, т.e. TDataSet.DoAfterScroll, например, из-за этого не возникает
Johnmen (2007-11-29 09:56:00) [5]
> А чтобы заполнить таблицу данными он пробегает по всем
> записям, видимым в гриде
Ну если быть точным, то по записям в буфере.
http://sql.ru/forum/actualthread.aspx?bid=20&tid=497291
ЮЮ (2007-11-29 09:25:00) [6]Что значит не меняет?
в OnDraw... грида DataSet спозиционирован именно на той записи, которую он отрисовывает. А чтобы заполнить таблицу даннымион пробегает по всем записям, видимым в гриде:
procedure TCustomDBGrid.DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState);
...
Value := '';
OldActive := FDataLink.ActiveRecord;
try
FDataLink.ActiveRecord := ARow;
if Assigned(DrawColumn.Field) then
Value := DrawColumn.Field.DisplayText;
Highlight := HighlightCell(ACol, ARow, Value, AState);
if Highlight then
begin
Brush.Color := clHighlight;
Font.Color := clHighlightText;
end;
if not Enabled then
Font.Color := clGrayText;
if FDefaultDrawing then
WriteText(Canvas, ARect, 2, 2, Value, DrawColumn.Alignment,
UseRightToLeftAlignmentForField(DrawColumn.Field, DrawColumn.Alignment));
if Columns.State = csDefault then
DrawDataCell(ARect, DrawColumn.Field, AState);
DrawColumnCell(ARect, ACol, DrawColumn, AState);
finally
FDataLink.ActiveRecord := OldActive;
end;
З.Ы. может твой датасет поддерживает RecNo на уровне базового?
function TDataSet.GetRecNo: Integer;
begin
Result := -1;
end;
procedure TDataSet.SetRecNo(Value: Integer);
begin
end;
:)
Anatoly Podgoretsky (2007-11-29 09:19:00) [7]Исходные коды тебе полностью доступны, смотри папку Source