Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1156496813
Гарик
2006-08-25 13:06
2006.09.17
А что сделалаешь ты?


15-1156771702
Черный Маг
2006-08-28 17:28
2006.09.17
Высший курс черной магии.


8-1141204700
Sour Smile
2006-03-01 12:18
2006.09.17
Как проиграть несколько звуков одновременно?


3-1152880058
danja12
2006-07-14 16:27
2006.09.17
переименовать поле в dbf-файле


3-1152168026
antoxa2005
2006-07-06 10:40
2006.09.17
Есть комп. DSL линия , постоянный IP, установленный FBServer база





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский