Программируем простой просмотровщик картинок на 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/" 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() 'клик на кнопке выхода END 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 < [ на главную ] |