Продолжение статьи “Семейный альбом“.

После выхода первой версии “Семейного альбома” прошло 8 месяцев. И у меня появился повод продолжить эту историю в позитивном ключе. Дело в том, что при разработке данной программы я столкнулся с очень серьёзной проблемой – низкой производительностью компонентов, отвечающих за отображение изображений: обычная загрузка картинки из файла и отображение на форме может занимать секунду и даже более, в зависимости от размера файла. С такими скоростями о режиме презентации можно забыть, а сам проект перевести в разряд учебных. Однако, после серии экспериментов с прозрачностью формы, мне удалось добиться приемлемой анимации при смене изображений с эффектом плавного перехода одного изображения в другое.

Ещё одним поводом вернуться к данному проекту послужило моё желание включить в программу ClearApp модули для работы с графикой, поэтому проект “Семейный альбом” я портировал на последнюю версию ClearApp, чтобы потом синхронизировать версии отдельных модулей. В результате немного изменился внешний вид программы: она обзавелась главным меню и другими вспомогательными функциями: настройкой темы, интерактивной помощью и возможностью регистрации программы.

Режим презентации сделан на весь экран. На моём 2К мониторе он работал вполне прилично, хотя в записи почему-то анимация не такая плавная – видимо, подвела программа захвата видео.

Ловкость рук

Для достижения эффекта пришлось создать три формы:

  • frmPlayer – форма с кнопками управления презентацией;
  • frmFrame1 – форма отображения картинки;
  • frmFrame2 – ещё одна форма отображения картинки.

frmFrame1 и frmFrame2 растянуты на весь экран, и, после загрузки картинки в компонент TdbImage, поочерёдно перемещаются на передний план. Анимация же получается за счет изменения свойства AlphaBlendValue от 0 (полная прозрачность) до 255 (полная непрозрачность) той формы, которая находится сверху.

В программе задействовано два таймера: для последовательной смены изображений и для автоматического сокрытия кнопок плеера через 5 секунд после того, как курсор мыши их покидает.

Скрипты

Библиотека ClearApp должна пополниться целой папкой ImageEdit, в которой находятся четыре модуля:

  • IEConstVar.pas – константы и переменные редактора изображений
  • ImageEdit.pas – редактор изображения
  • TargetImage.pas – виртуальный класс миниатюры редактора изображения
  • TargetImagePanel.pas – виртуальный класс панели миниатюр

Добавлены две полезные процедуры для формы:

  • Form_SavePosSize – сохранение позиции окна в параметрах
  • Form_RestorePosSize – восстановление положения и размера окна по данным из параметров


const
  FORM_PARAM_POS_SIZE = 'FormPosSize_';
  FORM_SECTION = 'Forms';
  FORM_WIDTH_DEF = 800;
  FORM_HEIGHT_DEF = 600;

procedure Form_SavePosSize(Sender: TObject;);
// сохранение позиции окна в параметрах
var
  tmpForm: TAForm;
  tmpName: string;
  tmpValue: string;
  tmpSection: string;
begin
  tmpForm := TAForm(Sender);
  // иногда форма по непонятным причинам находится за пределами видимости
  // поэтому проверяем на предмет полного отображения на экране.
  if (tmpForm.Top > 0) and (tmpForm.Left > 0) and ((tmpForm.Top + tmpForm.Height) < Screen.Height) and
    ((tmpForm.Left + tmpForm.Width) < Screen.Width) then
  begin
    tmpName := FORM_PARAM_POS_SIZE + TComponent(Sender).Name;
    if tmpForm.WindowState = wsMaximized then
      tmpValue := 'Maximized'
    else
      tmpValue := IntToStr(tmpForm.Left) + ',' + IntToStr(tmpForm.Top) + ',' + IntToStr(tmpForm.Width) + ',' +
        IntToStr(tmpForm.Height);
     tmpSection := FORM_SECTION;
    IniFile_Write(tmpSection,tmpName,tmpValue);
  end;
end;

procedure Form_RestorePosSize(Sender: TObject;);
// восстановление положения и размера окна по данным из параметров
// ВНИМАНИЕ! у формы свойство Position должно быть установлено в poDesigned
var
  tmpName: string;
  tmpForm: TAForm;
  s: array of string;
  tmpValue: string;
  tmpImage: TdbImage;
  tmpSection: string;
begin
  try
    tmpForm := TAForm(Sender);
    tmpName := FORM_PARAM_POS_SIZE + TComponent(Sender).Name;
    tmpSection := FORM_SECTION;

    tmpValue := IniFile_Read(tmpSection,tmpName,'');
    if tmpValue <> '' then // если параметр существует, то
    begin // восстановить положение и размер
      s := SplitString(tmpValue, ',');
      if s[0] = 'Maximized' then // если форма была развернута на весь экран
      begin
        tmpForm.Width := FORM_WIDTH_DEF;
        tmpForm.Height := FORM_HEIGHT_DEF;
        Form_Centered(tmpForm);
        tmpForm.WindowState := wsMaximized;
      end
      else
      begin
        tmpForm.Left := StrToInt(s[0]);
        tmpForm.Top := StrToInt(s[1]);
        tmpForm.Width := StrToInt(s[2]);
        tmpForm.Height := StrToInt(s[3]);
      end;
    end
    else
    begin
      Form_Centered(tmpForm);
    end;
  except
    RaiseException('Form_RestorePosSize() - '+ExceptionMessage);
  end;
end;Code language: Delphi (delphi)

Плеер

Форма плеера в дизайнере выглядит не очень презентабельно, но благодаря автоматической загрузке изображений для кнопок, должна быть вполне рабочей. Правда, я до сих пор не нарисовал кнопку выхода из режима презентации, но обещаю вскоре исправить это недоразумение.

На форме находится невидимая таблица со списком изображений, которые должны демонстрироваться. Ключевым методом формы является процедура frmPlayer_LoadData – анимированная загрузка очередного изображения из списка:

procedure frmPlayer_LoadData;
// загрузка данных
var
  tmpRow: integer;
  i: integer;
begin
  tmpRow := frmPlayer.tgrImageList.SelectedRow;
  if tmpRow <> -1 then
  begin
    if not frmFrame1.Visible then
    begin
      ImageEdit_LoadImageFromBase( frmFrame1.imgMain, StrToInt(frmPlayer.tgrImageList.cells[0,tmpRow]), IE_FT_ORIGINAL, IE_IT_IMAGE);
      frmFrame1.AlphaBlendValue := 0;
      frmFrame1.Show;
      frmPlayer.Show;
      for i := 0 to 127 do
      begin
        frmFrame1.AlphaBlendValue := i*2;
        Application.ProcessMessages;
        sleep(5);
      end;
      frmFrame2.Visible := False;
    end
    else
    begin
      ImageEdit_LoadImageFromBase( frmFrame2.imgMain, StrToInt(frmPlayer.tgrImageList.cells[0,tmpRow]), IE_FT_ORIGINAL, IE_IT_IMAGE);
      frmFrame2.AlphaBlendValue := 0;
      frmFrame2.Show;
      frmPlayer.Show;
      for i := 0 to 127 do
      begin
        frmFrame2.AlphaBlendValue := i*2;
        Application.ProcessMessages;
        sleep(5);
      end;
      frmFrame1.Visible := False;
    end;
  end;
end;Code language: PHP (php)

Очевидно, что данная процедура требует улучшения – нужно избавиться от похожего кода, создав отдельную процедуру с двумя параметрами, но пока пусть будет так.

Продолжение следует…

Один комментарий к “Семейный альбом. Анимация”
  1. Кстати, нашел интересный проект: https://tonfotos.com/ru/
    Программа для сортировки фотографий. Платная. Но хорошая. И перспективная. Есть свои плюсы и минусы. Но плюсов больше ))

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *