Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.04;
Скачать: CL | DM;

Вниз

Наследник 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.027 c
2-1169099675
Garacio
2007-01-18 08:54
2007.02.04
изменить/вернуть обратносистемную дату с помощью DateTimePicker


2-1168939463
nick_van_rijn
2007-01-16 12:24
2007.02.04
изменение переменных процесса снаружи


15-1168704775
default
2007-01-13 19:12
2007.02.04
кто-нибуль писал графические редакторы типа ERwin?


2-1169046976
Calibr
2007-01-17 18:16
2007.02.04
Клик мыши вне формы


9-1142779428
Sam Stone
2006-03-19 17:43
2007.02.04
Проникновение объектов друг в друга