![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Неразрешимая проблема из 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;