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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.08.2010, 21:49   #1
NoName_emaNoN
Форумчанин
 
Аватар для NoName_emaNoN
 
Регистрация: 15.11.2007
Сообщений: 229
По умолчанию Прогрузить Image в память

Добрый день!

Ситуация следующая: Есть Panel, на ней несколько Image'ев, некоторые имеют координату больше чем Panel.Width, т.е. находятся вне зоны видимости. Затем эти Image выводятся в зону видимости, т.е. становятся видны. И в этот момент, перехода картинки из невидимой зоны, в зону видимости программа подвисает на некоторое время (да картинки 1024*768 ~100 мс), всё бы ничего страшного, но картинок может быть много, и подвисание начинает раздражать.

После того как Image "прогрузился" его можно убрать в зону невидимости, вывести опять и "подвисать" не будет.

Из этого следует вопрос. Как этот Image прогрузить?
Компьютер не подчиняется законам физики: глюки возникают из ниоткуда, файлы исчезают в никуда, а вес измеряется в метрах.
NoName_emaNoN вне форума Ответить с цитированием
Старый 06.08.2010, 22:02   #2
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Хм.. Сложно сказать, мне кажется к этим вещам у вас доступа нет, это уже система у себя кэширует скорее всего. Но можно попробовать сделать имиджу Refrresh или Repaint, хотя вряд-ли поможет.
Можно решить вопрос иначе, юзать PaintBox, никуда его не двигать, а только обновлять в нем изображение, копируя откуда нужно. Но тут конечно, все вручную, такого удобства, как с имиджами на панели, не будет.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 06.08.2010, 23:10   #3
NoName_emaNoN
Форумчанин
 
Аватар для NoName_emaNoN
 
Регистрация: 15.11.2007
Сообщений: 229
По умолчанию

Refresh, Repaint, Update не помогает. Отсылать Image'у сообщение WM_PAINT и прочие тоже не помогает.

Я всё же думаю, и надеюсь что доступ к этому есть, ведь когда картинка показывается она кэшируется, думаю это делает сам Image, а не система, по крайней мере надеюсь на это

Удобство тут не так важно, важно чтобы работало. Думаете что если использовать PaintBox, то тормозить не будет? Каким образом тогда загружать картинки? Как TImage или как TPicture? Мне всё же кажется что при отрисовке на PaintBox всё равно будет происходить какая-то прогрузка.
Компьютер не подчиняется законам физики: глюки возникают из ниоткуда, файлы исчезают в никуда, а вес измеряется в метрах.
NoName_emaNoN вне форума Ответить с цитированием
Старый 07.08.2010, 02:00   #4
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Цитата:
Прогрузить Image в память
Эм... Дык оно ж и так в памяти.....
Цитата:
Затем эти Image выводятся в зону видимости, т.е. становятся видны.
Хм..... А каким образом выводятся? И какие у TImage установлены Width, Height (или AutoSize), Center, Strech и Proportional?

Form1.DoubleBuffered:=True; Panel1.DoubleBuffered:=True; и.т.д. - пробовали?
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 07.08.2010, 02:15   #5
NoName_emaNoN
Форумчанин
 
Аватар для NoName_emaNoN
 
Регистрация: 15.11.2007
Сообщений: 229
По умолчанию

Цитата:
Сообщение от DomiNick Посмотреть сообщение
Эм... Дык оно ж и так в памяти.....
Нет, оно не в памяти.

Цитата:
Сообщение от DomiNick Посмотреть сообщение
Хм..... А каким образом выводятся? И какие у TImage установлены Width, Height (или AutoSize), Center, Strech и Proportional?

Form1.DoubleBuffered:=True; Panel1.DoubleBuffered:=True; и.т.д. - пробовали?
Выводяться изменением координаты Left. Image.Height = Panel.Height. А Width подгоняется. AutoSize=False; Stretch, Propotional = True.

У Panel свойство DoubleBuffered = True. Форма здесь не причём, она роли не играет.

Я думаю есть некая функция на API для прогрузки самой картинки в память. Думаю нужно копать в эту сторону. Но что именно делать я не знаю, где эти API функции и прочее.
Может быть кто-нибудь знает такую функцию или как примерно найти выход?
Компьютер не подчиняется законам физики: глюки возникают из ниоткуда, файлы исчезают в никуда, а вес измеряется в метрах.

Последний раз редактировалось Stilet; 09.08.2010 в 08:25.
NoName_emaNoN вне форума Ответить с цитированием
Старый 07.08.2010, 12:34   #6
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

TImage всегда в памяти, изображение может загружаться из разных мест, но тоже в память и там оно и остается. Опиши нормально задачу, что ты хочешь получить и как ты это делаешь сейчас, после этого можно будет думать где и кто тормозит.
x128 вне форума Ответить с цитированием
Старый 07.08.2010, 12:55   #7
kSower
Пользователь
 
Аватар для kSower
 
Регистрация: 22.04.2010
Сообщений: 19
По умолчанию

попробуй загрузить изображение в TBitmap (или TJpeg, смотря что у тебя за формат), а потом нарисовать его в паинтбоксе. При перемещении перерисовывай на новое место на паинтбоксе. Поидее не должно томозить
Помогу с bass.dll новичкам.
ICQ: 588911177
kSower вне форума Ответить с цитированием
Старый 08.08.2010, 09:43   #8
NoName_emaNoN
Форумчанин
 
Аватар для NoName_emaNoN
 
Регистрация: 15.11.2007
Сообщений: 229
По умолчанию

Цитата:
TImage всегда в памяти, изображение может загружаться из разных мест, но тоже в память и там оно и остается. Опиши нормально задачу, что ты хочешь получить и как ты это делаешь сейчас, после этого можно будет думать где и кто тормозит.
Мы говорим о разных пямятях. Оно может находиться и не в памяти.
Весь процесс я описал в первом посте. Если что-то не понятно, то спрашивайте. Или переписать?

Цитата:
попробуй загрузить изображение в TBitmap (или TJpeg, смотря что у тебя за формат), а потом нарисовать его в паинтбоксе. При перемещении перерисовывай на новое место на паинтбоксе. Поидее не должно томозить
Уже советовали в посте выше. Тоже есть подозрение что может сработать. Попробую так реализовать.
Компьютер не подчиняется законам физики: глюки возникают из ниоткуда, файлы исчезают в никуда, а вес измеряется в метрах.
NoName_emaNoN вне форума Ответить с цитированием
Старый 08.08.2010, 11:09   #9
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

Цитата:
Прогрузить Image в память
Цитата:
Эм... Дык оно ж и так в памяти.....
Цитата:
Нет, оно не в памяти.
Цитата:
TImage всегда в памяти...
Цитата:
Мы говорим о разных пямятях
Какой-то каламбур, ты конкретизируй вопрос, что тебе нужно и в какую память. Обычно проблемный код люди показывают, а тут больше похоже на гадание...
Цитата:
Весь процесс я описал в первом посте. Если что-то не понятно, то спрашивайте. Или переписать?
Из первого поста ничего не понятно. Можно только предполагать, что не так. Что-то мне подсказывает, что ты пытаешься грузить картинку с диска когда это совсем не нужно. В любом случае, не видя код, тяжело дать однозначный ответ.
x128 вне форума Ответить с цитированием
Старый 08.08.2010, 19:59   #10
NoName_emaNoN
Форумчанин
 
Аватар для NoName_emaNoN
 
Регистрация: 15.11.2007
Сообщений: 229
По умолчанию

2 x128:

Код:
procedure TForm2.LoadPath(Path: string);
var
i,j:integer;
Image: TImage;
k:double;
begin
ClearImagesField;
CenterImage := -1;
Files.Directory := Path;

for I := 0 to Files.Count - 1 do
begin
  Image := TImage.Create(Panel1);
  Image.Name := 'Image'+inttostr(i);
  Image.Picture.LoadFromFile(Files.Items[i]);
  Image.Parent := Panel1;

  K:=Panel1.ClientHeight/Image.Picture.Height;

  Image.Stretch := True;
  Image.Proportional := True;
  Image.Height := Panel1.ClientHeight;
  Image.Width:=trunc(Image.Picture.Width*k);
  FWidths.Add(inttostr(Image.Width));
  FHeights.Add(inttostr(Image.Height));

//  Image.SendToBack;
//  Application.ProcessMessages;
//Image.Visible:=False;
//  Image.Invalidate;
//Image.Repaint;
  if i=0 then
  Image.Left := 0 else
  Image.Left := (Panel1.FindComponent(FImages[i-1]) as TImage).BoundsRect.Right;

//  Image.Visible:=true;

  Image.OnMouseDown:=Panel1MouseDown;
  Image.OnMouseUp:=Panel1MouseUp;

//  Image.Perform(WM_PAINT,0,0);
  FImages.Add(Image.Name);
end;
//Panel1.Perform(WM_SETREDRAW, 1, 0);
//Panel1.Refresh;
end;

procedure TForm2.MoveImages (n: integer);
var i: integer; Image: TImage;
begin
if CenterImage <> -1 then CenterImage := -1;

{!}//  Panel1.Update;
  Image := (Panel1.FindComponent(FImages[0]) as TImage);
  Image.Left := Image.Left - n;

  for i := 1 to FImages.Count - 1 do
  begin
    Image := (Panel1.FindComponent(FImages[i]) as TImage);
    Image.Left := (Panel1.FindComponent(FImages[i-1]) as TImage).BoundsRect.Right;
  end;
end;
Вот это две главные процедуры в приложении. Первая грузит картинки на панель. Вторая их двигает. Создайте простое приложение с панелькой и кнопкой. Загрузите картинки, и выполняйте процедуру MoveImages с любым значением, можно даже в таймере, нагляднее будет. Перед тем как показать новую картинку (ту которую ранее не было видно) будет не большое подвисание.
Компьютер не подчиняется законам физики: глюки возникают из ниоткуда, файлы исчезают в никуда, а вес измеряется в метрах.
NoName_emaNoN вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Image одной формы = Image другой формы DimR Microsoft Office Excel 2 21.04.2010 23:08
динамическая память zhenya.ya Помощь студентам 2 24.02.2010 20:58
Память Ghennadiy Общие вопросы Delphi 9 25.08.2009 09:23
Вопрос по Image (скачанная картинка не хочет выводиться в Image) Radnor Мультимедиа в Delphi 2 06.07.2009 02:20
Память процесса BlackOmen Общие вопросы Delphi 3 24.10.2008 20:16