Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];

Вниз

Наследник TDataSet   Найти похожие ветки 

 
Чапаев ©   (2006-05-10 11:29) [0]

Создаю сабж по образу и подобию %DELPHIDIR%\Demos\Db\TextData. Хочу сделать нечто вроде таблицы с фиксированным набором полей. Данные пытаюсь хранить в записи
 TUserRec=packed record
   Id:Integer;
   Name:string[NameLen];
   Password:string;
   Locale:Integer;
   Bookmark:Integer;
   BookmarkFlag:TBookmarkFlag;
 end;


Непонятности:
Правильно ли
function TUsersTable.AllocRecordBuffer: PChar;
begin
 GetMem(Result,SizeOf(TUserRec));
end;

function TUsersTable.GetRecordSize: Word;
begin
 Result := SizeOf(TUserRec)-5; //не учитывать bookmark & bookmarkflag
end;
?

function TUsersTable.GetFieldData(Field: TField; Buffer: Pointer): Boolean;
Вот тут непонятно... Почему Field.Size=0, если поле -- целое?

Как в этой функции с типом string управляться? С shortstring всё нормально, а вот что с длинными строками делать -- ума не приложу. :-(


 
TUser ©   (2006-05-12 11:03) [1]


> function TUsersTable.AllocRecordBuffer: PChar;
> begin
>  GetMem(Result,SizeOf(TUserRec));
> end;

Для начала скажи, почему эта хитрость называется PChar?


 
DrPass ©   (2006-05-12 11:46) [2]


> TUser ©   (12.05.06 11:03) [1]

Так возжелал Великий Борланд

> Правильно ли
> function TUsersTable.AllocRecordBuffer: PChar

Правильно

Чапаев ©   (10.05.06 11:29)  
> function TUsersTable.GetRecordSize: Word;

Не знаю. У "стандартного" датасета нет метода GetRecordSize, поэтому как должен работать твой собственный метод, знаешь только ты :-)

> Как в этой функции с типом string управляться? С shortstring
> всё нормально, а вот что с длинными строками делать -- ума
> не приложу. :-(

Как-нибудь так: StrLCopy(Buffer, pchar(s), min(Field.Size, length(s)));


 
Сергей М. ©   (2006-05-12 14:07) [3]


> Правильно ли
> function TUsersTable.AllocRecordBuffer: PChar;
> begin
>  GetMem(Result,SizeOf(TUserRec));
> end;


При Password:string - не правильно.


 
DrPass ©   (2006-05-13 19:38) [4]


> Сергей М. ©   (12.05.06 14:07) [3]


> При Password:string - не правильно

Почему? Буфер записи в датасете - это не вместилище данных, а просто "пользовательский" указатель, по которому ты потом будешь идентифицировать текущую запись.


 
jack128 ©   (2006-05-14 17:48) [5]

DrPass ©   (13.05.06 19:38) [4]
Почему?

потому что GetMem - не инициализирует буффер. В теории выделять память нужно так:
New(PUserData(Result));


 
DrPass ©   (2006-05-14 22:21) [6]


> jack128 ©   (14.05.06 17:48) [5]

Это понятно. Вопрос в том - зачем его инициализировать? Если, конечно, логика датасета построена как-то по-хитрому, инициализация может пригодиться. Но в общем случае достаточно просто выделить кусочек памяти - чтобы потом в GetRecord туда писать что нужно


 
Сергей М. ©   (2006-05-15 11:17) [7]


> DrPass ©   (13.05.06 19:38) [4]
>
>


> Почему? Буфер записи в датасете - это не вместилище данных


Потому что судя по (опять же не правильному) GetRecordSize


> Result := SizeOf(TUserRec)-5; //не учитывать bookmark &
> bookmarkflag


автор подразумевает именно содержимое буфера записи, а не указатель на него


 
jack128 ©   (2006-05-15 12:03) [8]

DrPass ©   (14.05.06 22:21) [6]
чтобы потом в GetRecord туда писать что нужно

и как писать??  Наверника так
PUserData(Buffer).Password := "Мой пароль"; // вот тут и будет AV


 
DrPass ©   (2006-05-15 20:41) [9]


> jack128 ©   (15.05.06 12:03) [8]

Согласен. Но по-хорошему, при GetRecord там достаточно будет делать move из внутреннего хранилища в активный буфер... хотя кто его знает. Без автора никак :-)

> Сергей М. ©   (15.05.06 11:17) [7]

В стандартном датасете ведь нет метода GetRecordSize... я не знаю, как и для чего автор собирается его использовать.


 
jack128 ©   (2006-05-15 23:04) [10]

DrPass ©   (15.05.06 20:41) [9]
В стандартном датасете ведь нет метода GetRecordSize...


есть.  По крайней мере в семерке.



Страницы: 1 вся ветка

Форум: "Компоненты";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.037 c
1-1166071583
kukuikar
2006-12-14 07:46
2007.02.04
Приостановка выключения системы


2-1168868626
Галинка
2007-01-15 16:43
2007.02.04
Как вытащить структуру датасета из XML


8-1149882016
ZV
2006-06-09 23:40
2007.02.04
LPT port


15-1168895678
VolJinn
2007-01-16 00:14
2007.02.04
Коммуникатор


2-1168979216
K@KTUS
2007-01-16 23:26
2007.02.04
Чат по локальной сети





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский