Главная » Delphi » Демонстрация картинок по списку

0

Процедура демонстрации у нас теперь упростится. Мы используем переменную п в новом качестве — как счетчик картинок, и вот как будет тогда выглядеть модернизированная Loadfile:

procedure Loadfile; {процедура поиска и загрузки файлов JPEG) begin

with Forml do begin

StaticTextN.Caption:=IntToStr(n+1); StaticTextName.Caption:=Filelist[n]; {имя из списка) fname:=stpath+’\’+Filelist[n]; Imagel.Picture.LoadFromFile(fname); {загружаем) StaticTextSize.Caption:=Sizelist[nj; {размер из списка) end; end;

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

п: =0 ; Loadfile;

Зато несколько усложнятся процедуры по ручной и автоматической демонстрации картинок. Создадим обработчик щелчка на кнопке BitBt.nL. который у нас до сих пор отсутствовал, и тогда три обработчика (вправо, влево и по таймеру) будут выглядеть так:

procedure TForml.TimerlTimer(Sender: TObject); begin

if Filelist.Count=0 then exit; (если нет картинок – выходим.) n:=n+l;

if n>Filelist.Count-l then n:=0; Iвкруговую)

{загружаем следующую картинку по списку:) Loadfile; end;

procedure TForml.BitBtnRClick(Sender: TObject);

begin {вправо – к концу списка)

Panel2.Visible:=False; {закрываем панель)

if Filelist.Count=0 then exit; {если нет картинок – выхолим) n:=n+l;

if n>Fileli5t.Count-l then n:=0; {вкруговую)

{загружаем следующую картинку по списку:) Loadfile; end;

procedure TForml.Bit3tnLClick(Sender: TObject);

begin {влево – к началу списка)

Panel2.Visible:=False; {закрьлзаем панель)

if Filelist.Count=0 then exit; lесли нет картинок – шкодим) if n=0 then n:=Filelist.Count-l else n:=n-l;{вкруговую)

{загружаем предыдущую картинку по списку:/ Loadfile; end;

Правильно ли мы тут все так упростили, просто пуская список вкруговую? Не надо ли при достижении конца списка (и начала— при обратном перелистывании) выводить предупреждение? Не думаю, на мой вкус, это излишне. ведь номер картинки у нас выводится. А вот предусмотреть возможность запуска автоматической демонстрации по таймеру не только вперед, но и назад по списку — вполне можно, но я оставляю это на откуп читателям (надо и пункте меню Демонстрация создать еще два подпункта Вперед и Назад, и переключать между ними, используя их свойство Checked, а также запоминать их состояние в INI-файле — как видите, довольно громоздко получается).

Сделаем еще одну вещь. Добавим пункт главного меню под названием Screenl и с заголовком Во весь экран. Горячую клавишу ему объявлять не будем — позже мы ее сделаем искусственно. По нему мы будем распахивать окно программы во весь экран и убирать рамку и заголовок формы. Сделаем так, чтобы при первом нажатии окно распахивалось, а при втором — рамка с заголовком появлялись обратно. Для события щелчка на этом пункте меню напишем такую процедуру:

procedure TForml.ScreenlClick(Senderr TObject); begin {во весь экран) if Forml.Filelist.Count=0 then exit;

{если а списке ничего нет – выход) Panel2.Visible:=False; {закрываем панель настроек) if BorderStyle=bsSizeable then begin

BorderStyle := bsNone; FormStyle := fsStayOnTop; Left := 0; Top := 0; Height:= Screen.Height; Width : = Screen.Width; end else begin

BorderStyle := bsSizeable; FormStyle := fsNormal; Height:= 620; Width := 850;

Position:=poDesktopCenter; end;

end;.

Сделать невидимым также и главное меню сложнее, но если хотите, то можете по очереди сделать невидимыми все его пункты.

Теперь сделаем все то же самое, но с клавиатуры. Для этого мы используем событие, которое еще ни разу не использовали, только упоминали о нем в главе 9 — onshortcut формы. Оно, в отличие от стандартных onKeyPress и onKevDown, позволяет распознать код любой нажатой клавиши, включая клавиши управления, и действует независимо от установки параметра KeyPreview. Чтобы перехватить нажатие, надо для нужного виртуального кода установить внутри процедуры параметр Handled в True, иначе будут выполняться всякие лишние действия. Мы сделаем гак, чтобы по клавише "Стрелка влево" список перелистывался к началу, по "Стрелке вправо" и "Пробелу" — к концу, а по нажатию <Esc> происходило бы то же самое, что в пункте меню Во весь экран (<Esc> и будет для него горячей клавишей):

procedure TForml.FormShortCut(var Msg: TWMKey; var Handled: Boolean); /перелистывание с клавиатуры)

begin

if Forml.Filelist.Count=0 then exit; /если а списке ничего нет) if (Msg.CharCode=vk_Right) or (Msg.CharCode=vk_Space) then (нажата клавиша "Стрелка вправо" или пробел) begin Handled:=True;

(перехват управления – иначе событие нажатия дублируется) Panel2.Visible:=False; /закрываем панель) BitBtnR.SetFocus;

if Filelist.Count=0 then exit; (если нет картинок – выходим) n:=n+l;

if n>Filelist.Count-l then n:=0; (вкруговую) (загружаем следующую картинку по списку:) Loadfile; end;

if Msg.CharCode=vk_Left then (нажата клавиша "Стрелка влево") begin Handled:=Тrue;

(перехват управления – иначе событие нажатия дублируется) Panel2.Visible:=False; /закрываем панель) BitBtnL.SetFocus;

if Filelist.Count=0 then exit; (если нет картинок – выходим! if n=0 then n:=Filelist.Count-1 else n:=n-l;(вкруговую) (загружаем предыдущую картинку по списку:) Loadfile; end;

if Msg.CharCode=vk_Escape then (нажата клавиша Esc) begin (во весь згфан) Handled:=True;

(перехват управления – иначе событие нажатия дублируется) Panel2.Visible:=False; (закрываем панель) if BorderStyls=bsSizeable then begin

BorderStyle := bsNone; FormStyle := fsStayOnTop; Left := 0; Top := 0; Height:= Screen.Height; Width := Screen.Width; end else begin

BorderStyle := bsSizeable; FormStyle := fsNormal;

Height:= 620; Width := 850;

Position:=poDesktopCenter; end; end; end;

Для того чтобы пользователь, не читая справки, узнал о существовании горячих клавиш, установим свойства showHint для обеих кнопок BitBtnR и BitBtnL в True, и запишем в свойстве Hint первой из НИХ Стрелка вправо, Пробел, а второй — просто Стрелка влево.

И наконец, "до кучи" сделаем все то же по щелчку мышью на компоненте imagel — подобно тому, как это делается в фотогалереях в Интернете (причем автоматически то же самое будет происходить и при щелчке на панели или на самой форме, ведь мы делали для них общий обработчик, см. главу 9). Однако не будем повторять грубую концептуальную ошибку разработчиков Windows, в которой при простой смене фокуса событие нажатия клавиши мыши не теряется, как должно было бы быть, а производит действия, как будто окно было активировано. То есть одновременно как бы происходят два события вместо одного и попасть мышью так, чтобы при этом что-нибудь не открылось, очень сложно (приятным исключением является окно Найти и Заменить в Word). У нас по щелчку мышью на imagel уже одно действие происходит— закрытие панели настроек, и если при всех других действиях оно совмещено с иной функциональностью специально, то перелистывать картинки одновременно с закрытием панели настроек совершенно ни к чему (в следующей главе мы заменим панель настроек на другой способ их отображения и эта проблема отпадет сама собой). В результате обработчик получится такой:

procedure TForml.ImagelClick(Sender: TObject); begin /перелистывание мышью)

if Panel2.Visible=True then Panel2.Visible:=False

(закрываем панель установки интервала)

else

begin

if Filelist.Count=0 then exit; (если нет картинок – выхолим) n:=n+l;

if n>Filelist.Count-l then n:=0; (вкруговую)

(загружаем следующую картинку по списку:) Loadfile; end; end;

Источник: Ревнч Ю. В.  Нестандартные приемы программирования на Delphi. — СПб.: БХВ-Петербург, 2005. — 560 е.: ил.

По теме:

  • Комментарии