Форум: "Прочее";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];
ВнизИли лыжи не едут, или что-то не так Найти похожие ветки
← →
pasha_golub © (2006-08-22 18:49) [0]В моем потомке ТДатасет при отображении через TDBGrid творяться чудныя вещи. То строки дублируются, то не дублируются, то поля пустые. В таблице то их всего-то три. А в гриде штук 12 вылазит. Я уж подумал, что кривизна рук не совместима с жизню. Потом лезу в исходники TDataLink из DB.pas и шо я вижу:
function TDataLink.GetRecordCount: Integer;
begin
if DataSource.State = dsSetKey then Result := 1 else
begin
Result := DataSource.DataSet.FRecordCount;
if Result > FBufferCount then Result := FBufferCount;
end;
end;
А на кой хрен, спрашивается, было определять виртуальный метод TDataset.GetRecordCount:
function TDataSet.GetRecordCount: Longint;
begin
Result := -1;
end;
Да еще и в хелпе писать: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.
Плюс FRecordCount в привате объявлен.
Ну, вот скажите, мне кто на асфальте в лыжи обутый, а? Три дня убил, блин... Уйду на Миддлет Паскаль, к чертям! ;-(
← →
Ega23 © (2006-08-22 18:53) [1]
> Result := DataSource.DataSet.FRecordCount;
Ага. В своё время, когда ковырял всю эту связку TDataSet -> TDataSource -> TDataLink был несказанно удивлён этой строчкой.
Даже, скажем, шокирован.
← →
pasha_golub © (2006-08-22 18:54) [2]
> Ega23 © (22.08.06 18:53) [1]
>
>
А шо ж ты молчал-то? ;0)
← →
Ega23 © (2006-08-22 18:58) [3]
> А шо ж ты молчал-то? ;0)
Почему? Как раз где-то с год назад, когда своё DBTree писал, именно этот вопрос и задавал. Общественность руками развела, мол "Это Борланд, им можно"...
← →
pasha_golub © (2006-08-22 18:59) [4]
> Ega23 © (22.08.06 18:58) [3]
И как победил? А что-то у меня мозг тупит, собака.
← →
Ega23 © (2006-08-22 19:07) [5]А никак... :(
Компонент будет работать только с теми потомками TDataSet, которые при открытии данные до конца фетчат. Хотя я уже давно ничего кроме TADODataSet и TClientDataSet не использую.
← →
ANB © (2006-08-22 19:16) [6]
> pasha_golub © (22.08.06 18:59) [4]
Посмотреть исходники одака или DOA. Там как то обошли, скорее всего писали свой TDataSet. Ща под рукой нету - подсказал бы. Скопируй и не мучайся.
← →
pasha_golub © (2006-08-22 19:17) [7]Не, ну я абсолютно нифига не понимаю. Использование FRecordCount размазано по всему TDataset. И в тоже время никакой возможности присвоить реальные данные ему не придвидится. Может там у него другое тайное предназначение, типо флаг, есть ли строки вообще?
← →
Ega23 © (2006-08-22 19:19) [8]А ты чего там ваяешь-то? Свою СУБД с компонентами доступа? А то вопросы у тебя больно интересные в последнее время... :о)
← →
pasha_golub © (2006-08-22 19:23) [9]
> ANB © (22.08.06 19:16) [6]
Глянем. Однако, вся прелесть в том, что данная гадость возникает при изумительныих условиях. А именно:
1. Используется TDBGrid
2. Имеется TMemoField
3. Имеется calculated field, который TStringField. И в итоге представляет собой нечто такое: StrField.AsString := Copy(memoField.AsString,1,100);
При других условиях, ну хоть ты танцуй никаких намеков на такое поведение. Мистика, блин.
Ща попробую проверить на TcxDBGrid... И заодно через стандартный TQuery..
← →
pasha_golub © (2006-08-22 19:24) [10]
> Ega23 © (22.08.06 19:19) [8]
Доваиваю. :0) Компоненты доступа.
← →
pasha_golub © (2006-08-22 19:31) [11]Вообщем, при более глубоком изучении создалось впечатление, что FRecordCount таки растет. Однако странным для меня образом.
До упора вызывается GetNextRecords & GetNextrecord, которые в свою очередь увеличивают FBufferCount. В дебрях того же датасета происходит проверка
If FRecordCount < FBufferCount then Inc(FRecordCount)
От чего мой воспаленный мозг делает вывод, что дяди из Борланда учитывали, что кол-во записей на момент чтения оных может быть не известно. Не исповедимы пути Господни. Воистину. Ибо.
← →
jack128 © (2006-08-22 20:34) [12]pasha_golub © (22.08.06 19:31) [11]
что дяди из Борланда учитывали, что кол-во записей на момент чтения оных может быть не известно
Вполне может быть. В IBX так и есть, например.
← →
pasha_golub © (2006-08-22 21:24) [13]Мужики, а знает ли кто-нибудь хорошее чтиво по внутренностям DB.pas и TDataset, в частности? Хелп явно не дотягивает. Пойдет, что угодно. В news"ах бывают прекрасные ветки.
ЗЫ Читал Голованова&Веселова "Создание компонентов ...". Есть информация, но мало.
← →
Petr V. Abramov © (2006-08-23 00:06) [14]> pasha_golub © (22.08.06 19:23) [9]
может, "особенности" TGridDataLink?
← →
pasha_golub © (2006-08-23 00:11) [15]
> Petr V. Abramov © (23.08.06 00:06) [14]
Да нет. Скорее всего мои собственные особенности, которые не учли особенности TGriddatalink. :0)
← →
Petr V. Abramov © (2006-08-23 00:14) [16]> pasha_golub © (23.08.06 00:11) [15]
ну оно понятно, что все особенности TGridDataLink называются фичами по оперделению и нних надо ориентироваться :)
← →
Anatoly Podgoretsky © (2006-08-23 00:48) [17]Нервы надо лечить.
← →
pasha_golub © (2006-08-23 10:07) [18]
> Anatoly Podgoretsky © (23.08.06 00:48) [17]
Как всегда глубокомысленно и не понятно. :P
← →
Desdechado © (2006-08-23 10:54) [19]> Ega23 © (22.08.06 19:07) [5]
> Компонент будет работать только с теми потомками TDataSet,
> которые при открытии данные до конца фетчат. Хотя я уже
> давно ничего кроме TADODataSet и TClientDataSet не использую.
Кстати, TClientDataSet умеет фетчить по запросу и пачками. Хотя по умолчанию - до конца.
← →
Ega23 © (2006-08-23 11:40) [20]
> Кстати, TClientDataSet умеет фетчить по запросу и пачками.
> Хотя по умолчанию - до конца.
Я знаю.
Кстати, именно из-за этой особенности (GetRecordCount) я компонент не стал в сеть выкладывать - уж очень он ограниченным получается...
← →
pasha_golub © (2006-08-23 11:58) [21]Вывод пока у меня один - нужно следить за количеством буфферов. И все будет ОК. Так как FRecordCount будет синхронизироваться. И пофигу пачками или заначками тащаться строки.
← →
pasha_golub © (2006-08-23 12:32) [22]Статья по написанию Датасетов: http://www.gexperts.com/CustomDS.html
← →
Андрей Пазик (2006-08-23 13:21) [23]Паша, зачем тебе стандартный грид? VirtualTree намного лучше в плане управляемости и скорости. Причем твой грид получается изначально заточенным под древообразную структуру, которая может пригодиться.
← →
pasha_golub © (2006-08-23 14:28) [24]Да мне то он и не нужен. Однако юзерам я не могу навязывать ничего.
Кстати, обнаружилось, что нельзя использовать данные из БЛОБов в расчетах calculated fields. Сами же ребяты из Борланда об этом говорят:
http://groups.google.ru/group/borland.public.delphi.database.sqlservers/browse_thread/thread/5fd81dd76f49ccb6/fdbd1b6bad4a9144?lnk=st&q=borland+calculated+fields+memo&rnum=5#fdbd1b6bad4a9144
Так что это, видимо, какие-то ограничения TDataset.
← →
Чапаев © (2006-08-23 19:00) [25]> В моем потомке ТДатасет при отображении через TDBGrid творяться
> чудныя вещи
Как человек, написавший некогда потомка TDataSet и помнящий основные "шишки", смею предположить, что где-то чему-то ты присваиваешь ActiveBuffer. Присваивай его локальную копию! ;-)
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.035 c