< [ на главную ]

Программируем простой просмотровщик картинок на Gambas !
 
 В этой статье я опишу свою маленькую программку просмотровщик, которая предназначена для демонстрации учебного материала, и написана на языке визуального программирования Gambas ! Для тех, кто хочет использовать эту программу для изучения языка Gambas , будут даны  краткие пояснения по коду программы . Заранее извиняюсь за свой непрофессиональный стиль кодинга , но как говориться " Чем богаты тем и рады ! "
Если вы еще не познакомились с этим языком программирования, то рекомендую для начала прочитать статью Гололобова В.Н. "Gambas - начни программировать сегодня !" на нашем сайте.
 
 
Итак:  1) скачиваем архив с программой  SView03.tar.gz  
           2) Распаковываем его в ваш домашний каталог
           3) Открываем Gambas , выбираем  "Открыть проект" и двойным кликом по папке с проектом загружаем его .
           4) Жмем на кнопку "Старт" на панели инструментов gambas и тестируем эту программу.
           5) В окне проекта кликаем по форме FMain и смотрим форму и код , если интересно !
           6) Если эта прога вам нужна собираем исполняемый файл :
               В меню gambas   / Проект / Собрать / Executable (в опциях рекомендую поставить галку "Создать ярлык на рабочем столе")
               и пользуемся на здоровье !

           Описание работы с программой SView :
 
Эта программа предназначена для последовательной демонстрации учебного материала и написана с целью экономии чернил моего принтера (т.к. раньше всю эту белиберду приходилось печатать).Она успешно работает на компе с 128Мгб ОЗУ и процессором  Pentium 733 МГгц в KDE под ALTLinux 4.0 (версия для учителей)  и активно используется в нашем ДОУ.      
При запуске программы вы попадаете в меню настроек ( это же меню вызывается кнопкой настройка в левом нижнем углу из работающей программы ) :




Здесь можно настроить р-р окна просмотровщика под нужное разрешение монитора ( по умолчанию 800х600 ). Кнопки Больше/Меньше предназначены для тех кто не умеет ( или не хочет ) убирать панели с экрана и позволяют подогнать р-р окна по вертикали.
Для начала работы  программы необходимо щелкнуть по любой картинке в нужном вам каталоге с изображениями .
После этого  мы попадаем в основное окно программы:



Здесь все просто (прога написана специально для воспитателей детского сада) . Кнопку настроек мы уже рассмотрели , кнопки со стрелками - предыдущее / следующее изображение и кнопка выхода . Я позаимствовал рисунки на кнопках у системы ( ибо ленив ), поэтому в KDE (это под XFCE-ом) значки будут выглядеть немного по другому .
Для работы с программой сканируем нужные изображения, изменяем р-р изображения (желательно не создавать изображений большого объема, что бы не перегружать ваш комп) . Например в XSane , которым я пользуюсь , есть полезная опция "изменить р-р изображения".
Для той же цели можно воспользоваться программой KolourPaint . Так как моя программа сортирует файлы по именам для вывода изображений в нужном порядке рекомендую первым символом имени ставить либо цифру от 0-9 либо букву латинского алфавита в порядке возрастания ( можно воспользоваться и другим нехитрым приемом - см. первый рисунок ). Все это раскладываем по папкам с занятиями в вашем домашнем каталоге и пользуемся. Я все подготавливаю дома, а потом заливаю с диска в нужный каталог в ДОУ.
Да , в окне включена растяжка изображения, поэтому при сканированнии желательно соблюдать примерные пропорции окна.

         Краткие объяснения по листингу программы.
В мои планы не входит писать подробнейшее описание листинга программы, ограничусь кратким изложением основного алгоритма. Если вас интересует какая-либо процедура более конкретно, спрашивайте через гостевую книгу сайта . В тексте проги набито довольно много примечаний ( я оставил и отладочные print-ы , которые печатают в консоль gambas разные полезные параметры ).
Итак, мы открываем рисунок при помощи FileChooser (FileC1) дальше при помощи довольно простой связки:
 dir1 = FileC1.dir
 katalog = Dir(dir1)
заполняем массив katalog именами файлов текущей директории
Все дальнейшии действия (сортировка, нахождение выбранного файла и просмотр следующего / предыдущего элемента) выпалняются  при помощи работы с этим массивом.
Так как в текущей дириктории могут быть не только картинки в процедуре Zagruzka вставлен селектор проверяющий выбранный элемент массива по расширению. В конце листинга находятся процедуры для изменения размера окна, рекурсивно вызывающие основную процедуру Form_Open c новыми значениями ширины и высоты формы.

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



' Gambas class file
PUBLIC name AS String ' имя файла
PUBLIC name1 AS String ' используется при поиске имени текущего файла в массиве имен
PUBLIC dir1 AS String 'имя каталога
PUBLIC flag AS Boolean 'флаг
PUBLIC katalog AS Array 'массив из имен файлов
PUBLIC Size AS Integer 'максимальный номер массива имен
PUBLIC Numb AS Integer 'номер текущего имени файла в массиве
PUBLIC dx AS Integer
PUBLIC dy AS Integer
PUBLIC dyold AS Integer

PUBLIC SUB Init() 'начальная инициализация параметров

flag = FALSE

'name = "/home/k/FonTest/1.jpg"

FileC1.Dir = "/home/"

dir1 = FileC1.Dir

katalog = Dir(dir1)

Size = katalog.Max

Numb = 0

dy = 580 ' высота формы

dx = 800 ' ширина формы

dyold = 600

END 

PUBLIC SUB _new()

Init

Form_Open

END

 

PUBLIC SUB Form_Open()

 'переменные введены для правильного положения кнопок при разных р-рах формы

FMain.Width = dx

FMain.Height = dy

PBox1.Width = dx

PBox1.Height = dy - 42

PBox1.X = 0

PBox1.Y = 0

TextL1.Height = dy - (2 * Label1.Height) - (5 * ButPlus.Height) - 42

ButSelect.Y = dy - 40

ButPrev.Y = dy - 40

ButNext.Y = dy - 40

ButExit.Y = dy - 40

ButSelect.X = 0

ButPrev.X = (dx / 2) - 120

ButNext.X = (dx / 2) + 60

ButExit.X = dx - 60

FileC1.Height = dy - 42

FileC1.Width = dx - 140

FileC1.X = 140

FileC1.Filter = ["*.png;*.jpg;*.jpeg;*.bmp", "Picture files"]

'PRINT name

'PBox1.Picture = Picture.Load(name) 'загрузка начального рисунка на форму 

END

 

PUBLIC SUB FileC1_Activate() 'процедура выбора файла для открытия и инициализая массива имен

DIM z AS Integer

FileC1.Dir = "/home/"

name = FileC1.SelectedPath

dir1 = FileC1.Dir

PBOX1.Picture = Picture.Load(name)

FileC1.Visible = FALSE

Label1.Visible = FALSE

ButPlus.Visible = FALSE

ButMinus.Visible = FALSE

TextL1.Visible = FALSE

But800.Visible = FALSE

But1024.Visible = FALSE

But1280.Visible = FALSE

TVisota.Visible = FALSE

PRINT name

PRINT "-------------------"

katalog = Dir(dir1) 'инициализация массива имен

Size = katalog.Max

Sort()

Numb = 0

FOR z = 0 TO Size STEP 1 'поиск в массиве имен имени файла совпадающего с выбранным

name1 = dir1 & "/" & katalog[z]

IF name1 = name THEN Numb = z 'определение номера этого имени в массиве

NEXT

PRINT "Numb="; Numb

PRINT dir1

END

 

PUBLIC SUB Sort() 'процедура сортировки массива имен файлов

DIM i AS Integer

DIM j AS Integer

DIM buf AS String 'буфер для перестановки элементов массива

DIM a AS String

DIM bmin AS String

Size = katalog.Max

PRINT "Size="; Size

PRINT "/ / / / / / / / / /"

FOR j = 0 TO Size STEP 1

bmin = katalog[j]

FOR i = j TO Size STEP 1

a = katalog[i]

IF a < bmin THEN

buf = katalog[j]

katalog[j] = a

katalog[i] = buf

bmin = a

ELSE

ENDIF

NEXT

katalog[j] = bmin

PRINT "j="; j; " "; bmin

NEXT

PRINT "/ / / / / / / / /"

FOR i = 0 TO Size STEP 1

PRINT katalog[i]

NEXT 

END

  

PUBLIC SUB ButExit_Click() 'клик на кнопке выхода

ME.Close

END

 
PUBLIC SUB ButSelect_Click() 'клик на кнопке выбора файла

FileC1.Visible = TRUE

Label1.Visible = TRUE

ButPlus.Visible = TRUE

ButMinus.Visible = TRUE

TextL1.Visible = TRUE

But800.Visible = TRUE

But1024.Visible = TRUE

But1280.Visible = TRUE

TVisota.Visible = TRUE

END

 

PUBLIC SUB Zagruzka() 'получение имени файла из массива и загрузка изображения

flag = TRUE

name = katalog[Numb]

name = dir1 & "/" & name

PRINT name

name1 = Right$(name, 4) 'получение типа файла из имени

PRINT "Name1=", name1

SELECT CASE name1 'проверка на правильность типа

CASE ".jpg"

PBOX1.Picture = Picture.Load(name)

CASE "jpeg"

PBOX1.Picture = Picture.Load(name)

CASE ".bmp"

PBOX1.Picture = Picture.Load(name)

CASE ".png"

PBOX1.Picture = Picture.Load(name)

CASE ELSE

flag = FALSE 'ошибка-неправильный тип файла

END SELECT

END

 

PUBLIC SUB ButPrev_Click() 'клик на кнопке выбора предыдущего файла

'katalog = Dir(dir1)

Size = katalog.Max

name = katalog[Numb]

PRINT name

Label1:

Numb = Numb - 1

IF Numb < 0 THEN Numb = 0 'защита от выхода за нижнюю границу массива

Zagruzka

IF flag = FALSE AND Numb > 0 THEN GOTO Label1

END

 

PUBLIC SUB ButNext_Click() 'клик на кнопке выбора последующего файла

'katalog = Dir(dir1)

Size = katalog.Max

name = katalog[Numb]

PRINT name

Label2:

Numb = Numb + 1

IF Numb > Size THEN Numb = Size 'защита от выхода за верхнюю границу массива

Zagruzka

IF flag = FALSE AND Numb < Size THEN GOTO Label2

END


 

PUBLIC SUB ButPlus_Click()

IF dy < dyold THEN

dy = dy + 20

Form_Open

ELSE

END IF

END

 

PUBLIC SUB ButMinus_Click()

IF dy > dyold - 200 THEN

dy = dy - 20

Form_Open

ELSE

END IF

END


 

PUBLIC SUB But800_Click()

dx = 800

dy = 580

dyold = 580

Form_Open

END

 

PUBLIC SUB But1024_Click()

dx = 1024

dy = 750

dyold = 750

Form_Open

END

 

PUBLIC SUB But1280_Click()

dx = 1280

dy = 1004

dyold = 1004

Form_Open

END

Вобщем, код хоть и не блещет совершенством, но работает !

Что может быть в новых версиях этой программы ?

Если я еще вернусь к этой теме , то в первую очередь уберу FileChooser и заменю его на самодельное средство выбора файлов построенное на работе с массивами имен . Во- первых FileChooser не дает подниматься к корню из домашнего каталога, во-вторых почти все средства необходимые для написания своего Chooser-а в этой программе уже есть. Видимо нужно сделать еще отключатель растяжки ( или пропорциональную растяжку ) изображения . Есть еще довольно любопытная идейка, как сделать коррекцию яркости картинки (для севших труб). И конечно неплохо все настройки сохранять в файле, а не начинать работу со значениями по умолчанию.
Успехов вам братья-пингвины в изучении визуального программирования !

 P.S. эта программа написана на Gambas2.0 и будет ли она работать в более ранних версиях не знаю !
24.01.2009  kostyalamer
< [ на главную ]




Hosted by uCoz