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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.09.2010, 16:13   #1
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
Вопрос Медленная загрузка изображения из TImageList

Здравствуйте! Возникла одна проблемка. Есть 3 ImageList'а. В одном 5 картинок, в других двух по 6 штук. В зависимости от ситуации загружается картинка из определенного листа в компонент TImage, например вот так (это когда из второго листа, не в этом суть):
Код:
  ImgR.GetBitmap(Random(5), ImgCurrent.Picture.Bitmap);
При закрытии формы делаю так:
Код:
  ImgCurrent.Picture := nil;
Вроде картинка с имджа должна стереться. Но при следующем вызове формы и открытии картинки примерно в каждом третьем случае на долю секунды проглядывает предыдущая картинка, которая потом заменяется на новую. Почему?
k1r1ch вне форума Ответить с цитированием
Старый 05.09.2010, 16:18   #2
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

Вы форму то точно из памяти выгружаете?
FaTaL вне форума Ответить с цитированием
Старый 05.09.2010, 16:29   #3
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
По умолчанию

Форма, на которой все происходит - не основная. Она просто закрывается методом Close, а потом открывается методом Show
k1r1ch вне форума Ответить с цитированием
Старый 05.09.2010, 17:36   #4
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

Ну вы форму когда создаёте? Перед показом или форма создаётся с загрузкой приложения и всегда висит в памяти?
FaTaL вне форума Ответить с цитированием
Старый 05.09.2010, 17:43   #5
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
По умолчанию

2-ой вариант
--------------------
Ну прогресс определенный появился, когда я заменил обнуление Picture на рисование прямоугольника:
Код:
  ImgCurrent.Picture.Bitmap.Canvas.FillRect(Rect(0, 0, 256, 256));
Теперь предыдущая картинка видна только в каждом пятом случае
--------------------
Теме ап! Меня ж такой результат не устраивает...

Теме АП! Очень хотелось бы услышать ответ...

Последний раз редактировалось Stilet; 06.09.2010 в 09:57.
k1r1ch вне форума Ответить с цитированием
Старый 06.09.2010, 10:00   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А может ты весь текст проекта покажешь?
И кстати
Код:
ImgCurrent.Picture.Bitmap.FreeImage
подойдет?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.09.2010, 18:25   #7
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
Сообщение

Цитата:
Сообщение от Stilet Посмотреть сообщение
ImgCurrent.Picture.Bitmap.FreeImage
Если так сделать, то следующее изображение обрежется по контуру непрозрачности предыдущего, например, если был круг (на белом фоне), а следующий квадрат, то квадрат будет обрезан кругом.
Ну в общем, вот код той формы:
Код:
unit Splash;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, ImgList;

type
  TSplashF = class(TForm)
    Timer: TTimer;
    ImgCurrent: TImage;
    ImgW: TImageList;
    ImgR: TImageList;
    ImgRes: TImageList;
    procedure FormCreate(Sender: TObject);
    procedure TimerTimer(Sender: TObject);
    procedure FormClick(Sender: TObject);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure ShowSplash(SplashType: integer; TimeInt: integer = 1000;
	Mark: integer = 1);
    procedure ShowResultImg(Param: integer);
    procedure ShowRightImg;
    procedure ShowWrongImg;
    procedure CloseForm;
  end;

const
  SPLASH_RIGHT = 1;
  SPLASH_WRONG = 2;
  SPLASH_RESULT = 3;

var
  SplashF: TSplashF;

implementation

uses Main;

{$R *.dfm}

procedure TSplashF.CloseForm;
begin
  //ImgCurrent.Picture.Bitmap.Canvas.FillRect(Rect(0, 0, 256, 256));
  Timer.Enabled := false;
  SplashF.Close;
end;

procedure TSplashF.FormClick(Sender: TObject);
begin
  CloseForm;
end;

procedure TSplashF.FormCreate(Sender: TObject);
begin
  ImgCurrent.Left := (Screen.Width-ImgCurrent.Width) div 2;
  ImgCurrent.Top := (Screen.Height-ImgCurrent.Height) div 2;
end;

procedure TSplashF.FormKeyPress(Sender: TObject; var Key: Char);
begin
  CloseForm;
end;

procedure TSplashF.ShowRightImg;
begin
  if Main.KidsMode then ImgR.GetBitmap(Random(5), ImgCurrent.Picture.Bitmap)
  else ImgR.GetBitmap(0, ImgCurrent.Picture.Bitmap);
end;

procedure TSplashF.ShowWrongImg;
begin
  if Main.KidsMode then ImgW.GetBitmap(Random(5), ImgCurrent.Picture.Bitmap)
  else ImgW.GetBitmap(0, ImgCurrent.Picture.Bitmap);
end;

procedure TSplashF.ShowResultImg(Param: integer);
begin
  ImgRes.GetBitmap(Param-1, ImgCurrent.Picture.Bitmap);
end;

procedure TSplashF.ShowSplash(SplashType: integer; TimeInt: integer = 1000; Mark: integer = 1);
begin
  case SplashType of
    SPLASH_RIGHT: ShowRightImg;
    SPLASH_WRONG: ShowWrongImg;
    SPLASH_RESULT: ShowResultImg(Mark);
  end;
  Timer.Interval := TimeInt;
  Timer.Enabled := true;
  SplashF.ShowModal;
end;

procedure TSplashF.TimerTimer(Sender: TObject);
begin
  CloseForm;
end;

end.
На форме три имейдж листа: с картинками оценок (ImgRes), с картинками правильного ответа (ImgR), с картинками неправильного ответа (ImgW). Также там есть таймер Timer.
Из главной формы это окно вызывается при верном/неверном ответе, а также в конце теста для выставления оценки (ну все уже поняли, что это очередная тестирующая программа ) методом ShowSplash.
---------------------------------------------------------------------------------
Может проект скинуть, тогда и сами увидите? А то ответа нет, а проблема есть...

Последний раз редактировалось k1r1ch; 07.09.2010 в 14:51.
k1r1ch вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка изображения _-Re@l-_ Общие вопросы Delphi 7 31.05.2010 14:54
Загрузка поврежденного изображения Linel PHP 1 30.05.2010 17:25
Загрузка изображения из exe Volkogriz Общие вопросы Delphi 13 18.01.2010 17:51
Загрузка изображения из потока Joe_Tribbiani Общие вопросы Delphi 1 22.04.2009 03:07
Загрузка изображения JRcoker Мультимедиа в Delphi 15 04.11.2008 18:32