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

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

Неразрешимая проблема из GLScene ? Сохранение float-значения [D7]


TGLDummyCube ©   (2005-01-18 02:38:00) 

Есть компоенент TGLDummyCube
Вот часть кода :
TGLDummyCube = class (TGLCameraInvariantObject)
 private
   FCubeSize : TGLFloat;
...
 protected
   procedure SetCubeSize(const val : TGLFloat);
...
 public
   constructor Create(AOwner : TComponent); override;
...
 published
   property CubeSize : TGLFloat read FCubeSize write SetCubeSize;
end;

...

// Create
//
constructor TGLDummyCube.Create(AOwner : TComponent);
begin
 inherited;
 ...
 FCubeSize:=1;
 ...
end;


Проблема в том, что CubeSize невозможно сохранить как равное нулю. Потому, что Дельфи по умолчанию считает, что Флоаты равны нулю, и поэтому, если установить CubeSize в ноль, и сохранить программу, то Дельфи не сохранит CubeSize вообще, так как его значение равно значению по умолчанию, а когда мы загрузим программу, то выполниться конструктор, который устоновит CubeSize
в единицу.

Такая проблема. Её в принципе можно разрешить ? Или она неразрешима в принципе ?


Набережных С.   (2005-01-20 09:00:00) [1]


 private
....
   procedure ReaderProc(Reader: TReader);
   procedure WriterProc(Writer: TWriter);
 protected
   procedure DefineProperties(Filer: TFiler); override;
...
 published
  property CubeSize : TGLFloat read FCubeSize write SetCubeSize stored false;
 end;

procedure TTestComponent.DefineProperties(Filer: TFiler);
begin
 inherited;
 Filer.DefineProperty('CubeSize', ReaderProc, WriterProc, FCubeSize <> 1);
end;

procedure TTestComponent.ReaderProc(Reader: TReader);
begin
 FCubeSize:=Reader.ReadFloat;
end;

procedure TTestComponent.WriterProc(Writer: TWriter);
begin
 Writer.WriteFloat(FCubeSize);
end;
</code


TGLDummy   (2005-01-20 03:45:00) [2]

Облом, да ? Облом ?


TGLDummyCube   (2005-01-19 01:11:00) [3]


> VMcL ©   (18.01.05 08:14) [11]
> P.S. Можно попробовать поискать по архивам форума.

Они слишком большие, я немогу столько скачивать.
Так, проблеа точно неразрешима ? Может есть какой обходной путь ?


VMcL   (2005-01-18 08:14:00) [4]

>> TGLDummyCube  (18.01.05 07:55) [9]

Если не ошибаюсь, подобная или такая же проблема когда-то обсуждалась в разделе "Компоненты". По-моему, пришли к выводу, что это баг Delphi.


VMcL   (2005-01-18 08:14:00) [5]

P.S. Можно попробовать поискать по архивам форума.


TGLDummyCube   (2005-01-18 07:55:00) [6]

Ещё раз проверил. Нет. Ноль не сохраняется. Или это глюк ? Пойду ещё перекомпилирую.


TGLDummyCube   (2005-01-18 07:53:00) [7]

// SetCubeSize
//
procedure TGLDummyCube.SetCubeSize(const val : TGLFloat);
begin
if val<>FCubeSize then begin
 FCubeSize:=val;
 StructureChanged;
end;
end;


Юрий Зотов   (2005-01-18 07:17:00) [8]

> TGLDummyCube   (18.01.05 07:00) [6]

Что-то накручено. Приведите код метода SetCubeSize.


TGLDummyCube   (2005-01-18 07:00:00) [9]


> Юрий Зотов ©   (18.01.05 05:49) [3]

Так, если параметр установить в ноль, то он начинает сохраняться !
Но к сожалению, сохраняется как равный единице. Видать чего-то ещё ему не хаватает.


Юрий Зотов   (2005-01-18 06:12:00) [10]

> Kerk ©   (18.01.05 05:56) [4]

Функция - несколько байт 1 раз.
Безусловное сохранение - по 4 байта несколько раз.


Kerk   (2005-01-18 05:56:00) [11]

Может стоит stored Trueи не воротить столько?


Юрий Зотов   (2005-01-18 05:49:00) [12]

...
private
 function IsCubeSizeStored: boolean;    
 ...
published
 property CubeSize: TGLFloat read FCubeSize write SetCubeSize stored IsCubeSizeStored;
 ...

function TGLDummyCube.IsCubeSizeStored: boolean;
begin
 Result := FCubeSize <> 1
end;


TGLDummyCube   (2005-01-18 03:51:00) [13]

В общем проблема наверное сводится к тому, можно ли определить кто вызвал конструктор ? Дельфи, когда загружала программу, или пользователь, когда своими руками ( мышами ) создал TGLDummyCube.


TGLDummyCube   (2005-01-18 03:48:00) [14]

type
 TGLfloat = Single;


Наверх

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