Форум: "Компоненты";
Текущий архив: 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.047 c