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

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

Сохранение свойства типа array - линкер не пущает [D6, WinXP]


AZ ©   (2004-11-08 03:59:00) 

Не подскажет ли уважаемое сообщество, почему линкер после установки зарегистрированного компонента на форму
воспринимает DFM-файл как 16-и разрядный?

Делаю сохранение свойства в DFM как обычно:

procedure TShiftSett.DefineProperties(Filer: TFiler);
begin
 inherited;
 Filer.DefineProperty('ShChiefs',LoadShChiefs,SaveShChiefs,True);
end;

procedure TShiftSett.LoadShChiefs(Reader: TReader);
var
 i: integer;
begin
 for i:=0 to 3 do begin
  FShChiefs[i].ChiefName:=Reader.ReadString;
  FShChiefs[i].ShiftNo:=Reader.ReadInteger;
  FShChiefs[i].ShTime:=Reader.ReadFloat;
 end;
end;

procedure TShiftSett.SaveShChiefs(Writer: TWriter);
var
 i: integer;
begin
 for i:=0 to 3 do begin
  Writer.WriteString(FShChiefs[i].ChiefName);
  Writer.WriteInteger(FShChiefs[i].ShiftNo);
  Writer.WriteFloat(FShChiefs[i].ShTime);
 end;
end;

А линкер обижается и говорит, что 16-и битные DFM не поддерживает...
То что дело именно в сохранении свойства, показывет закомментирование вышеуказанных процедур.


AZ   (2004-11-10 04:32:00) [1]

>Юрий Зотов ©   (09.11.04 16:21) [1]

Жаль, что Вы не мой лечащий врач...
Ваш дагноз, как всегда, точен.
Большое спасибо.


Юрий Зотов   (2004-11-09 16:21:00) [2]

Попробуйте так:

procedure TShiftSett.LoadShChiefs(Reader: TReader);
var
 i: integer;
begin
 Reader.ReadListBegin;
 for i := 0 to 3 do
 begin
   FShChiefs[i].ChiefName := Reader.ReadString;
   FShChiefs[i].ShiftNo := Reader.ReadInteger;
   FShChiefs[i].ShTime := Reader.ReadFloat;
 end;
 Reader.ReadListEnd;
end;

procedure TShiftSett.SaveShChiefs(Writer: TWriter);
var
 i: integer;
begin
 Writer.WriteListBegin;
 for i := 0 to 3 do
 begin
   Writer.WriteString(FShChiefs[i].ChiefName);
   Writer.WriteInteger(FShChiefs[i].ShiftNo);
   Writer.WriteFloat(FShChiefs[i].ShTime);
 end;
 Writer.WriteListEnd;
end;

Если снова будет ругаться, попробуйте использовать Read/WriteListBegin и Read/WriteListEnd внутри циклов.


Наверх

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