![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему не обновляется RecordCount?
Ega23 © (2005-06-14 19:00:00)Имеем следующую ситуацию:
TTreeDataLink = class(TDataLink)
private
FTree: TCustomKdrDBTreeView;
public
constructor Create(ATree:TCustomKdrDBTreeView);
procedure DataSetChanged; override;
end;
constructor TTreeDataLink.Create(ATree: TCustomKdrDBTreeView);
begin
inherited Create;
FTree:=ATree;
VisualControl:=True;
end;
//*****************************************************************************
procedure TTreeDataLink.DataSetChanged;
begin
inherited;
showmessage(IntToStr(DataSet.RecordCount));
end;
//*****************************************************************************
Я точно знаю, что у данного DataSet'а RecordCount>0 (есть DBGrid, привязанный к этому же DataSet'у).
ANB (2005-06-15 12:26:00) [21]
> Ega23 © (15.06.05 11:21) [18]
Попробуй так :
ShowMessage('DataSet. '+IntToStr(MyDataSet.RecordCount));
И опубликуй тип дейтасета. Возможно, товй тип не юзает RecordCount, как уже писал
> -=XP=- © (15.06.05 10:00) [14]
Ega23 (2005-06-15 12:22:00) [22]2 sniknik © (15.06.05 12:07) [19]
Тут вот какая фишка: есть DBTree, есть некий графический план. Есть DataSet, в котором имеется следующая информация:
ZoneID, ZoneParentID, ZoneName, ZoneGraph. Последнее поле - BLOB, в котором лежит информация - набор точек для рисования полигона, цвет полигона и т.п.
Нужно: при открытии DataSet'а заполнить дерево, а также на графическом плане отрисовать все зоны по правилам из DataSet'а.
При перемещении по DataSet'у нужно выделять нужную зону на граф.плане и фокусироваться на нужный узел в DBTree.
При этом инициатором неремещения курсора DataSet'а может служить как граф.план (ткнули мышкой в зону), так и DBTree (выбрали какой-то нод), а также сторонний DB-компанент (DBGrid или DBNavigator, например).
sniknik (2005-06-15 12:07:00) [23]DataSet.Last;
уже же предлагалось.
> Методы DataSet'а, которые двигают курсор, использовать нельзя. Иначе всем остальным компонентам рассылка пойдёт. Причём, даже
> Disable/EnableControls не поможет.
поможет,
тебе же не надо делать это постоянно, один раз при открытии (либо для твоего случая на DataSetChanged на случай не полного фетча записей в новозаданном рекордсете, сделал, вернул курсор на место никто и заметит (если данных не много ;))
Ega23 (2005-06-15 11:21:00) [24]2 ANB © (15.06.05 11:06) [17]
procedure TFMain.Button1Click(Sender: TObject);
begin
ShowMessage('Grid. '+IntToStr(RxDBGrid1.DataSource.DataSet.RecordCount)+#13+
'Link. '+IntToStr(Link.DataSource.DataSet.RecordCount));
end;
Результат: Grid. -1
Link. -1
ANB (2005-06-15 11:06:00) [25]
> Ega23 © (15.06.05 10:10) [16]
- а ну да, я хэлп невнимательно прочитал. Попробуй отдельной кнопкой посмотреть RecordCount дэйтасета и вывести ShowMessage(IntToStr(dl.DataSource.DataSet.RecordCount));
Сообщи результат.
Ega23 (2005-06-15 10:10:00) [26]2 ANB © (15.06.05 09:59) [13]
- вообще то не должно срабатывать при перемещении по гриду. Странно.
Я пишу свой компонент - TDBTreeView. Вот приблизительный код:
TTreeDataLink = class(TDataLink)
private
FTree: TCustomKdrDBTreeView;
public
constructor Create(ATree:TCustomKdrDBTreeView);
procedure DataSetChanged; override;
procedure ActiveChanged; override;
end;
TCustomKdrDBTreeView = class(TCustomTreeView)
private
FDataLink: TTreeDataLink;
FKeyField: String;
FDisplayField: String;
FParentField: String;
FDataSource: TDataSource;
procedure SetFDataSource(const Value: TDataSource);
protected
property DataSource:TDataSource Read FDataSource Write SetFDataSource;
property DisplayField:String Read FDisplayField Write FDisplayField;
property KeyField:String Read FKeyField Write FKeyField;
property ParentField:String Read FParentField Write FParentField;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
Создаю его на форме. Также на форме лежит DBGrid. И DBGrid и мой компонент "смотрят" на один и тот же DataSource.
Ega23 (2005-06-15 10:04:00) [27]Какой класс Вашего DataSet'а?
Может быть любой. Это для ДБ-компонента делается. Может быть и ADOQuery, TQuery, TTable, TClientDataSet etc.
Нужно универсальное решение.
-=XP=- (2005-06-15 10:00:00) [28]Еще раз.
function TDataSet.GetRecordCount: Longint;(С) VCL
begin
Result := -1;
end;
Возвращаемое значение зависит от унаследованного класса.
Посему еще раз вопрос: Какой класс Вашего DataSet'а?
ANB (2005-06-15 09:59:00) [29]
> Событие срабатывает при перемещению по DBGrid.
- вообще то не должно срабатывать при перемещении по гриду. Странно.
ANB (2005-06-15 09:53:00) [30]
> would be 1.
>
> Это TDataLink.RecordCount
Там же 1, а не -1. Странно, на примере в обоих Count получилось 1, хотя в дейтасете - 9.
ANB (2005-06-15 09:51:00) [31]У меня работает правильно :
var dl : TDataLink;
. . .
ShowMessage(IntToStr(dl.DataSource.DataSet.RecordCount));
и
ShowMessage(IntToStr(dl.DataSet.RecordCount));
- выдают правильные результаты.
А вот ShowMessage(IntToStr(dl.RecordCount)); и ShowMessage(IntToStr(dl.BufferCount)); - вертают всегда 1. Что то у тебя с родным дейтасетом. Проверь его отдельно.
Ega23 (2005-06-15 09:43:00) [32]2 ANB © (15.06.05 09:38) [8]
In most cases, RecordCount is the same as BufferCount. RecordCount indicates the number of records actually in the record buffer of the dataset, as opposed to the number of records that the dataset can possibly maintain. For example, a data-aware grid with four rows could have one record actually showing data. In this case, BufferCount would be 4, while RecordCount would be 1.
Это TDataLink.RecordCount
ANB (2005-06-15 09:39:00) [33]Я нарывался в одаке на проблему, что если выбраны не все записи, до RecordCount показывает, только, сколько выбрал, но не -1, значит это другая проблема. Ща я примерчик у себя попробую . . .
ANB (2005-06-15 09:38:00) [34]Странно, чего то тебе не от туда справку кинули, не вижу про -1 :
Indicates the number of records in the internal record buffer maintained by the dataset.
Delphi syntax:
property RecordCount: Integer;
C++ syntax:
__property int RecordCount = {read=GetRecordCount, nodefault};
Description
Read RecordCount to determine the number of actual records in the buffer maintained by the dataset for the Owner of this TDataLink.
In most cases, RecordCount is the same as BufferCount. RecordCount indicates the number of records actually in the record buffer of the dataset, as opposed to the number of records that the dataset can possibly maintain. For example, a data-aware grid with four rows could have one record actually showing data. In this case, BufferCount would be 4, while RecordCount would be 1.
Ega23 (2005-06-15 09:01:00) [35]2 -=XP=- © (14.06.05 19:31) [5]
Так что может помочь DataSet.Last;
Методы DataSet'а, которые двигают курсор, использовать нельзя. Иначе всем остальным компонентам рассылка пойдёт. Причём, даже Disable/EnableControls не поможет.
-=XP=- (2005-06-14 19:34:00) [36]Некторые DataSet'ы показывают количество записей только при полном прохождении всех записей до конца. Так что может помочь DataSet.Last;
-=XP=- (2005-06-14 19:31:00) [37]"В лоб":
function RecordCount(ADataSet: TDataSet): integer;
var
BM: TBookmark;
begin
Result := 0;
ADataSet.DisableControls;
try
BM := ADataSet.GetBookmark;
try
ADataSet.First;
while not ADataSet.Eof do
begin
Result := Result + 1;
ADataSet.Next;
end;
ADataSet.GotoBookmark(BM);
finally
ADataSet.FreeBookmark;
end;
finally
ADataSet.EnableControls;
end;
end;
:o)
P.S. Так кто же Ваш DataSet?
Ega23 (2005-06-14 19:25:00) [38]Я уже понял, что RecordCount будет -1.
Проблема такая: мне нужно в DataLink'е увидеть ВСЕ записи (отсортировать определённым образом выборку и нарисовать дерево).
Вопрос стоит так: как увеличить DataLink.BufferCount? Точнее, увеличить-то его просто, обычным сложением. Вопрос на сколько его увеличить? По-идее, нужно поставить
DataLink.BufferCount:=DataLink.DataSet.RecordCount
но он -1...
-=XP=- (2005-06-14 19:19:00) [39]As implemented in TDataSet, RecordCount is always -1. Ordinarily an application does not access RecordCount at the TDataSet level. Instead a redeclared and implemented RecordCount property in a descendant class is accessed. RecordCount provides a fallback property for derived dataset classes that do not reimplement the property access method.
Кто есть Ваш DataSet?
Ega23 (2005-06-14 19:17:00) [40]Упс-с... Там RecordCount тоже -1...