Сохранение и чтение компоненты из файла
От: spion_007  
Дата: 06.11.04 12:03
Оценка:
На форме лежит компонента ImageList со списком изображений. Для предоставления возможности пользователю удалять и добавлять изображения из этого списка было решено использовать методы
AddMasked(...)
и
Delete(...)
этой компоненты, а измененную таким образом компоненту сохраняю в файл с помощью

WriteComponentResFile(FILE_NAME,MyImageList);


при загрузке приложения эта компонента читается с помощью

TComponent* temp = ReadComponentResFile(FILE_NAME, NULL);
           MyImageList = static_cast<TImageList*>(temp);


чтобы все это работало дело работало провожу регистрацию следующим образом:

void RegisterClassesWithStreamingSystem(void)
{
  #pragma startup RegisterClassesWithStreamingSystem
  Classes::RegisterClass(__classid(TImageList));
}


Так вот, если я просто удаляю из компоненты одно из изображений с помощью описанной выше
Delete(...)
, то компонента сохраняется в файл, если же я добавляю изображение с помощью
AddMasked(...)
, то записи компоненты в файл не происходит, и при этом не появляется никаких признаков ошибок
В чем может быть дело?

Заранее спасибо
С уважением, Сергей
Re: Сохранение и чтение компоненты из файла
От: Leonid Troyanovsky  
Дата: 06.11.04 15:16
Оценка:
Здравствуйте, spion_007, Вы писали:

_>На форме лежит компонента ImageList со списком изображений. Для предоставления возможности пользователю удалять и добавлять изображения из этого списка было решено использовать методы
AddMasked(...)
и
Delete(...)
этой компоненты, а измененную таким образом компоненту сохраняю в файл с помощью


Я бы предпочел сохранять-читать сам список, а не компонент. Скажем,

by Vladimir Titov.

uses
  commctrl;

procedure ImageList_WriteData(ImageList: TImageList; Stream: TStream);
var
  SA: TStreamAdapter;
begin
  SA := TStreamAdapter.Create(Stream);
  try
    if not ImageList_Write(ImageList.Handle, SA) then
      raise EWriteError.Create('Failed to write ImageList data to stream');
  finally
    SA.Free;
  end;
end;

procedure ImageList_ReadData(ImageList: TImageList; Stream: TStream);
var
  SA: TStreamAdapter;
begin
  SA := TStreamAdapter.Create(Stream);
  try
    ImageList.Handle := ImageList_Read(SA);
    if ImageList.Handle = 0 then
      raise EReadError.Create('Failed to read ImageList data from stream');
  finally
    SA.Free;
  end;
end;

procedure ImageList_SaveToFile(ImageList: TImageList; const FileName: string);
var
  FileStream: TFileStream;
begin
  FileStream := TFileStream.Create(FileName, fmCreate);
  try
    ImageList_WriteData(ImageList, FileStream);
  finally
    FileStream.Free;
  end;
end;

procedure ImageList_LoadFromFile(ImageList: TImageList; const FileName:
string);
var
  FileStream: TFileStream;
begin
  FileStream := TFileStream.Create(FileName, fmShareDenyNone);
  try
    ImageList_ReadData(ImageList, FileStream);
  finally
    FileStream.Free;
  end;
end;
--
С уважением, LVT
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.