Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.07.2009, 16:13   #1
andrey4623
Форумчанин
 
Аватар для andrey4623
 
Регистрация: 31.05.2007
Сообщений: 266
По умолчанию Проблема с Graphic и MemoryStream

Здравствуйте! У меня не компилируется следующий код:

Код:
        //Имя объекта
        fs.Read(str, sizeof(str));
        //Размер структуры
        fs.ReadBuffer(Size,SizeOf(Integer));
        // Сами данные
        ms.CopyFrom(fs,Size);
        Pic:=TPicture.Create;
        ms.Seek(0,soFromBeginning);
        //до этого шага все в порядке
        Pic.Graphic.LoadFromStream(ms); //ЗДЕСЬ ОШИБКА
        
with Form8.TreeView1.Items.Add(nil, str) do
          Data := Pic;
Почему с Graphic проблема?
andrey4623 вне форума Ответить с цитированием
Старый 15.07.2009, 16:25   #2
Evgeniy26
Форумчанин
 
Аватар для Evgeniy26
 
Регистрация: 29.05.2009
Сообщений: 384
По умолчанию

У тебя ms: TStream?
Evgeniy26 вне форума Ответить с цитированием
Старый 15.07.2009, 16:48   #3
andrey4623
Форумчанин
 
Аватар для andrey4623
 
Регистрация: 31.05.2007
Сообщений: 266
По умолчанию

TMemoryStream
andrey4623 вне форума Ответить с цитированием
Старый 15.07.2009, 16:51   #4
Evgeniy26
Форумчанин
 
Аватар для Evgeniy26
 
Регистрация: 29.05.2009
Сообщений: 384
По умолчанию

Что пишет? У меня нормально компилит.
Evgeniy26 вне форума Ответить с цитированием
Старый 15.07.2009, 16:53   #5
andrey4623
Форумчанин
 
Аватар для andrey4623
 
Регистрация: 31.05.2007
Сообщений: 266
По умолчанию

Пишет запрещен доступ
andrey4623 вне форума Ответить с цитированием
Старый 15.07.2009, 16:54   #6
andrey4623
Форумчанин
 
Аватар для andrey4623
 
Регистрация: 31.05.2007
Сообщений: 266
По умолчанию

При исполнении. В ошибке пишет: "Чтение по адресу 00000..."
andrey4623 вне форума Ответить с цитированием
Старый 15.07.2009, 18:26   #7
Evgeniy26
Форумчанин
 
Аватар для Evgeniy26
 
Регистрация: 29.05.2009
Сообщений: 384
По умолчанию

Код:
var
  ms: TMemoryStream;
  Pic: TPicture;
begin
  with TOpenDialog.Create(nil) do
  begin
    if not Execute then
    begin
      Free;
      exit;
    end;
    ms := TMemoryStream.Create;
    try
      ms.LoadFromFile(FileName);
      ms.Seek(0,soBeginning);
      pic := TPicture.Create;
      try
        pic.Bitmap.LoadFromStream(ms);
        Image1.Picture.Assign(pic);
      finally
        pic.Free;
      end;
    finally
      Free;
      ms.Free;
    end;
  end;

Последний раз редактировалось Evgeniy26; 15.07.2009 в 19:13.
Evgeniy26 вне форума Ответить с цитированием
Старый 16.07.2009, 18:45   #8
andrey4623
Форумчанин
 
Аватар для andrey4623
 
Регистрация: 31.05.2007
Сообщений: 266
По умолчанию

Спасибо. А почему нельзя выполнить следующий код:
Pic.Graphic.LoadFromStream(ms)?
Ведь метод SaveToStream для Graphic выполняется, а Load - нет.
andrey4623 вне форума Ответить с цитированием
Старый 16.07.2009, 19:10   #9
Evgeniy26
Форумчанин
 
Аватар для Evgeniy26
 
Регистрация: 29.05.2009
Сообщений: 384
По умолчанию

Как я понимаю объект не создан, а обращение к методам не созданного объекта не допустимо:
Код:
var
  ms: TMemoryStream;
  Pic: TPicture;
begin
  with TOpenDialog.Create(nil) do
  begin
    if not Execute then
    begin
      Free;
      exit;
    end;
    ms := TMemoryStream.Create;
    try
      ms.LoadFromFile(FileName);
      ms.Seek(0,soBeginning);
      pic := TPicture.Create;
      try
        pic.Graphic := TBitmap.Create;
        pic.Graphic.LoadFromStream(ms);
        Image1.Picture.Assign(pic);
      finally
        pic.Free;
      end;
    finally
      Free;
      ms.Free;
    end;
  end;
Evgeniy26 вне форума Ответить с цитированием
Старый 16.07.2009, 19:30   #10
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

TGraphic - абстрактный класс.
Когда вызываем:
pic.Bitmap.LoadFromStream(ms);
Создается объект соответствующий формату файла с изображением и присваивается переменной Graphic.
После создания:
pic := TPicture.Create;
Объект TGraphic (а именно его потомок) не создан, поэтому и исключение вылетает.

Если этот объект предварительно создать:
Pic.Graphic := TBitmap.Create;
То загрузка произойдет уже удачно:
Pic.Graphic.LoadFromStream(ms);
Или при повторной загрузке, тоже самое:
pic := TPicture.Create;
pic.Bitmap.LoadFromStream(ms);
...
Pic.Graphic.LoadFromStream(ms);

Вот так вот.

P.S. Опаздал я с ответом.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".

Последний раз редактировалось Daramant; 16.07.2009 в 19:32.
Daramant вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
intel graphic library и сокеты ikot Работа с сетью в Delphi 2 02.06.2009 01:43
graphic.h sizzlorr Общие вопросы C/C++ 1 12.05.2009 20:11
Загрузить видео из MemoryStream Hottabych Мультимедиа в Delphi 3 25.03.2009 05:47
Поиск в MemoryStream... Hottabych Общие вопросы Delphi 6 17.02.2009 20:37
Проблема с отправкой MemoryStream от сервера к клиенту Ragnarek Работа с сетью в Delphi 4 07.02.2009 10:29