Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Наследник 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?


Наверх

Титульная страница Поиск, карта сайта Написать письмо