![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Наследник TDataSet
Чапаев © (2006-05-10 11:29:00)Создаю сабж по образу и подобию %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 всё нормально, а вот что с длинными строками делать -- ума не приложу. :-(
jack128 (2006-05-15 23:04:00) [1]DrPass © (15.05.06 20:41) [9]
В стандартном датасете ведь нет метода GetRecordSize...
есть. По крайней мере в семерке.
DrPass (2006-05-15 20:41:00) [2]
> jack128 © (15.05.06 12:03) [8]
Согласен. Но по-хорошему, при GetRecord там достаточно будет делать move из внутреннего хранилища в активный буфер... хотя кто его знает. Без автора никак :-)
> Сергей М. © (15.05.06 11:17) [7]
В стандартном датасете ведь нет метода GetRecordSize... я не знаю, как и для чего автор собирается его использовать.
jack128 (2006-05-15 12:03:00) [3]DrPass © (14.05.06 22:21) [6]
чтобы потом в GetRecord туда писать что нужно
и как писать?? Наверника так
PUserData(Buffer).Password := 'Мой пароль'; // вот тут и будет AV
Сергей М. (2006-05-15 11:17:00) [4]
> DrPass © (13.05.06 19:38) [4]
>
>
> Почему? Буфер записи в датасете - это не вместилище данных
Потому что судя по (опять же не правильному) GetRecordSize
> Result := SizeOf(TUserRec)-5; //не учитывать bookmark &
> bookmarkflag
автор подразумевает именно содержимое буфера записи, а не указатель на него
DrPass (2006-05-14 22:21:00) [5]
> jack128 © (14.05.06 17:48) [5]
Это понятно. Вопрос в том - зачем его инициализировать? Если, конечно, логика датасета построена как-то по-хитрому, инициализация может пригодиться. Но в общем случае достаточно просто выделить кусочек памяти - чтобы потом в GetRecord туда писать что нужно
jack128 (2006-05-14 17:48:00) [6]DrPass © (13.05.06 19:38) [4]
Почему?
потому что GetMem - не инициализирует буффер. В теории выделять память нужно так:
New(PUserData(Result));
DrPass (2006-05-13 19:38:00) [7]
> Сергей М. © (12.05.06 14:07) [3]
> При Password:string - не правильно
Почему? Буфер записи в датасете - это не вместилище данных, а просто "пользовательский" указатель, по которому ты потом будешь идентифицировать текущую запись.
Сергей М. (2006-05-12 14:07:00) [8]
> Правильно ли
> function TUsersTable.AllocRecordBuffer: PChar;
> begin
> GetMem(Result,SizeOf(TUserRec));
> end;
При Password: string- не правильно.
DrPass (2006-05-12 11:46:00) [9]
> 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)));
TUser (2006-05-12 11:03:00) [10]
> function TUsersTable.AllocRecordBuffer: PChar;
> begin
> GetMem(Result,SizeOf(TUserRec));
> end;
Для начала скажи, почему эта хитрость называется PChar?