Вопросы новичка

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Вопросы новичка

Сообщение BugMaker » 19.10.2011 12:57:57

Модуль Graph является устаревшим, надо смотреть что за код, и править - тяжелое наследие турбо паскаля :)

PS. Кстати, у меня в SVN этот модуль есть. Не знаю, насколько уж рабочий :)
BugMaker
новенький
 
Сообщения: 10
Зарегистрирован: 23.07.2011 22:26:56

Re: Вопросы новичка

Сообщение Lugat » 19.10.2011 22:49:53

Доброго времени суток.
Суть такова :) Имеется два комбобокса, и переменная, которая принимает значение в зависимости от значения (простите за тавтологию) комбобоксов. Математической зависимости нет. Просто значения.
В итоге всех ухищрений у меня получилась такая вот муть:
Код: Выделить всё
begin
     case combobox1.ItemIndex of
       0: case combobox2.ItemIndex of
          0: drop_eff:=2;
          1: drop_eff:=3;
          2: drop_eff:=4;
          3: drop_eff:=5;
          4: drop_eff:=6;
          5: drop_eff:=7;
          end;
       1: case combobox2.ItemIndex of
          0: drop_eff:=8;
          1: drop_eff:=9;
          2: drop_eff:=10;
          3: drop_eff:=11;
          4: drop_eff:=12;
          5: drop_eff:=13;
          end;
       2: case combobox2.ItemIndex of
          0: drop_eff:=2;
          1: drop_eff:=3;
          2: drop_eff:=4;
          3: drop_eff:=5;
          4: drop_eff:=6;
          5: drop_eff:=7;
          end;
       3: case combobox2.ItemIndex of
          0: drop_eff:=2;
          1: drop_eff:=3;
          2: drop_eff:=4;
          3: drop_eff:=5;
          4: drop_eff:=6;
          5: drop_eff:=7;
          end;
       4: case combobox2.ItemIndex of
          0: drop_eff:=2;
          1: drop_eff:=3;
          2: drop_eff:=4;
          3: drop_eff:=5;
          4: drop_eff:=6;
          5: drop_eff:=7;
          end;
       5: combobox2.ItemIndex of
          0: drop_eff:=2;
          1: drop_eff:=3;
          2: drop_eff:=4;
          3: drop_eff:=5;
          4: drop_eff:=6;
          5: drop_eff:=7;
          end;
       6: case combobox2.ItemIndex of
          0: drop_eff:=2;
          1: drop_eff:=3;
          2: drop_eff:=4;
          3: drop_eff:=5;
          4: drop_eff:=6;
          5: drop_eff:=7;
          end;
       end;

В итоге переменная будет принимать значения иные от указанных в этом листе. Значения сии абсолютно не будут связаны между собой математически.
Возможно, кто-нибудь подскажет, как можно сократить этот код до удобочитаемых размеров? Заранее благодарен.
Lugat
незнакомец
 
Сообщения: 2
Зарегистрирован: 19.10.2011 22:32:47

Re: Вопросы новичка

Сообщение Mr.Smart » 19.10.2011 22:58:41

например так:
Код: Выделить всё
const
  c_drop_eff: array [0..6,0..5] of Integer = ((2,3,4,5,6,7), (8,9,10,11,12,13),(2,3,4,5,6,7),(2,3,4,5,6,7),...);
begin
  drop_eff:=c_drop_eff[combobox1.ItemIndex][combobox2.ItemIndex];
end;
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Вопросы новичка

Сообщение Lugat » 19.10.2011 23:33:12

Mr.Smart, огромное спасибо!
Lugat
незнакомец
 
Сообщения: 2
Зарегистрирован: 19.10.2011 22:32:47

Re: Вопросы новичка

Сообщение BugMaker » 21.10.2011 04:27:37

А я бы сделал так:
Код: Выделить всё
begin
  if combobox1.itemindex=1
  then drop_eff:= combobox2.ItemIndex+8
  else drop_eff:= combobox2.ItemIndex+2;
end;
BugMaker
новенький
 
Сообщения: 10
Зарегистрирован: 23.07.2011 22:26:56

Re: Вопросы новичка

Сообщение Leon » 22.11.2011 21:58:48

Ребята,здравствуйте.
Столкнулся с архитрудной для меня задачей.Не знаю как работать с ресурсами в Лазарусе.
Eсть программка,которая произносит определенные звуки через PlaySound.Первым ее параметром есть указатель на каталог и требуемый в нем звуковой файл.Но я хочу,чтобы эти звуки были откомпилированы в составе конечного ехе-файла.
Пробовал занести эти файлы в список инспектора проекта.Но компиляция не получилась.Стоило убрать каталог со звуками,как конечный ехе файл на требование проиграть конкретный звук выдает одно пищание.
Приемы работы с ресурсами в Делфи для Лазаруса не подошли.Нет в Лазарусе ни каталога BIN,ни фала в нем brcc32.exe.Библиотека RxLib оказалась для меня крутой.Как начал компилить...,то того нету,то сего.Вобщем одно расстройство.
Как быть? Может кто подскажет?
Leon
новенький
 
Сообщения: 65
Зарегистрирован: 30.03.2011 09:27:02

Re: Вопросы новичка

Сообщение Сквозняк » 23.11.2011 02:31:08

Запиши содержимое звукового файла в массив типизованных констант. При старте программы определи каталог в котором она находится и путь к каталогу в котором создашь файл и перепишешь в него содержимое массива. После чего можешь проигрывать этот файл средствами PlaySound.
Сквозняк
энтузиаст
 
Сообщения: 1129
Зарегистрирован: 29.06.2006 22:08:32

Re: Вопросы новичка

Сообщение Vadim » 23.11.2011 05:50:30

Leon писал(а):Приемы работы с ресурсами в Делфи для Лазаруса не подошли.

На самом деле приёмы абсолютно одинаковы, только не надо слепо следовать каждой букве, а лучше подходить к задаче вдумчиво. ;)
Во-первых, компилятор ресурсов называется по другому - windres.exe.
Во-вторых, расположение компилятора ресурсов - найдите его самостоятельно... ;)
В-третьих, не исключено, что Вам и не надо будет вручную компилировать ресурсный файл, просто добавьте в свою программу:
{$R имя_ресурсного_файла.rc}
а уж компилятор его сам попробует откомпилировать при компиляции Вашей программы. Конечно, он его откомпилирует только если ресурсный файл составлен правильно и звуковой файл, который должен быть воспроизведён, находится именно в том месте, в котором Вы указали (а то судя по Вашим возгласам
Leon писал(а):Нет в Лазарусе ни каталога BIN,ни фала в нем brcc32.exe.

Вы не имеете ни малейшего понятия, где и какие файлы находятся на Вашем компьютере. :) )
А уж дальше PlaySound() будет работать именно так, как написано в MSDN. ;)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Вопросы новичка

Сообщение Leon » 23.11.2011 12:23:08

Спасибо,ребята.Не судите строго,новичек он и есть новичек.Если я понемногу справлялся с ТурбоПаскалем 5,то это не значит,что я буду крутым в Лазарусе.Простите за назойливость,но как записать ресурсные файлы в файл RC? Я с этим никогда не имел дела.Нашел-таки я файл делфовский,компилятор ресурсов,потренировался,но он больше чем один звуковой файл не обрабатывает.Я писал так: brcc23 sound.wav Так получился файл RES. Попробовал brcc32 sound1.wav sound2 wav и ничего не вышло.Посему прошу помощи еще.

1.Напишите код,как нужно правильно писать файл RC,чтобы загнать в ресурсы несколько звуковых файлов (или картинок).
2..Как к тем ресурсам потом доступиться,чтобы их играл ПлейСаунд.Дайте пример кода.
Всем спасибо.
Leon
новенький
 
Сообщения: 65
Зарегистрирован: 30.03.2011 09:27:02

Re: Вопросы новичка

Сообщение Vadim » 23.11.2011 14:34:40

Ресурсный файл - это обычный текстовый файл, в котором пишутся:
1. Идентификатор ресурса
2. Тип ресурса
3. Имя файла, который надо загнать в ресурс
Таким образом, для трёх, к примеру, звуковых файлов будет что-то вроде этого:
Код: Выделить всё
MYSOUND1 SOUND "music\music1.wav"
MYSOUND2 SOUND "music\music2.wav"
MYSOUND3 SOUND "music\music3.wav"

В программе Вы будете обращаться к ресурсу по его идентификатору:
Код: Выделить всё
PlaySound('MYSOUND1', 0, SND_RESOURCE+SND_SYNC);
PlaySound('MYSOUND3', 0, SND_RESOURCE+SND_SYNC);
PlaySound('MYSOUND3', 0, SND_RESOURCE+SND_SYNC);

В третьем параметре флаг SND_RESOURCE говорит о том, что звук воспроизводится из ресурса. Флаг SND_SYNC в данном случае нужен для того, чтобы воспроизведение следующей мелодии начиналось только после окончания предыдущей.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Вопросы новичка

Сообщение Leon » 23.11.2011 20:35:23

Решил просмотреть ответы на мои предыдущие посты.

1.BugMaker,модуль "Граф" понадобился программе "Осциллограф" которую я скатал с Инета и пытался конвертировать из Делфи в Лазарус.Есть там такой пункт в меню Лазаруса.При попытке запустить конвертированную программу она и выдала мне,что ей нужен Граф.Потом я нашел этот Граф в пунктах меню Лазаруса,но почему его не увидела система - не знаю.Может это не тот Граф,что ей нужен...

2."Сквозняк",идея загонять ресурсы в типизированные массивы мне показалась интересной.Но при попытке загнать в массивы эдак файлов 20 интерес значительно поубавился.

3.Vadim'у спасибо за конструктивный совет и примеры кода.Жму вам руку! :))

Теперь у меня вылезла странная фича.Может кто сообразит,что происходит.Когда я пишу программу,естественно у меня бывает желание поделиться ею еще с кем-то.Так вот.У меня два ноута.Первый - Тошиба А50 с экраном 15д.,второй - Эйсер Эспайр 7110 с экраном 17д.На обоих стоит одна и та же Виндоуз ХР SP2 одной версии и сборки.Программы пишу на Тошибе.Попробовал ЕХЕ файл перенести на Эйсер и запустить.И,о боги,я увидел только одну форму с картинками.Надписи,подготовленные в TStatictext не видны.На Тошибе они были белыми на черном фоне,на Эйсере они оказались черными на черном.Залил Лазарус на Эйсер.Скопировал проект и попытался заменить фонт на другой.Никакой разницы... Не меняется ни цвет символов,но фон.Фон остается таким же как и у общей формы,а цвет символов не меняется вообще.Виндоус на обоих один,Лазарус тоже.И что за фича такая,когда на одном работает,а на другом - нет?
Leon
новенький
 
Сообщения: 65
Зарегистрирован: 30.03.2011 09:27:02

Re: Вопросы новичка

Сообщение Leon » 01.12.2011 12:55:05

Как я понял вопрос экспертам задан крутой...

Вопрос к Vadim.Код представленный Вами работает на ура.Но тут назрела модификация.Я цепляю к ноутбуку внешнюю USB звуковую карточку.Как этот самый PlaySound программно перенаправить на нее? Чтобы внутренняя карточка компа выполняла стандартные функции (скажем так,например,чтобы подавала системные звуки когда надо),а внешняя карточка выполняла плейсаунды из программы? Если не трудно,дайте пример кода.Спасибо
Leon
новенький
 
Сообщения: 65
Зарегистрирован: 30.03.2011 09:27:02

Re: Вопросы новичка

Сообщение Vadim » 01.12.2011 13:14:31

Leon
Вы излишне высокого мнения обо мне. :D Навскидку я такого сказать не могу, надо поэкспериментировать. На данный момент я этот вопрос представляю только с точки зрения чистой теории, а Вам ведь нужна голая практика... ;)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Вопросы новичка

Сообщение Leon » 01.12.2011 14:15:47

Ну так поэкспериментируйте.Или хотя бы дайте идею как это сделать,а я еще и сам тут покопаюсь.Вдвоем веселее будет,а там и людям на форуме расскажем что у нас получилось. :D
Leon
новенький
 
Сообщения: 65
Зарегистрирован: 30.03.2011 09:27:02

Re: Вопросы новичка

Сообщение Vadim » 01.12.2011 14:57:37

Leon
Я к сессии готовлюсь, так что поле для экспериментов у меня специфическое. :)

Добавлено спустя 45 минут 16 секунд:
Leon
Если на уровне чисто идей, то вот Вам идеи. :)
PlaySound() воспроизводит звуки на ближайшем устройстве, т.е., условно говоря - на Device0. Любая вставляемая Вами дополнительная звуковая карточка будет уже Device1. Таким образом, воспроизведение с помощью PlaySound() на несколько устройств будет топорное - надо программно отключать один из девайсов и если Вы работаете на компе не с правами администратора, то, сами понимаете, отключить устройство не Вашей власти.
Более цивилизованный способ - играть звуки с помощью функций, которые начинаются на waveOut. Это более трудоёмкий процесс, с точки зрения программирования, но в этом случае Вы можете выбирать устройство воспроизведения, какое Вам нужно.
Алгоритм примерно такой:
1. Получить количество устройств вывода звука на компе - waveOutGetNumDevs();
2. Проверить, под каким номером скрывается нужное Вам устройство - waveOutGetDevCaps(), подставляя, в качестве одного из параметров номер девайса, количество которых берётся из предыдущей функции. А вот эта функция возвращает характеристики каждого устройства в переменной типа Record под названием LPWAVEOUTCAPS, одно из полей которого содержит название устройства (поле szPname).
3. Найденое необходимое для воспроизведения устройство открывается функцией waveOutOpen(), в котором, в качестве одного из параметров, указывается номер выбранного устройства.
4. Что там следует дальше, я уже не помню... :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 221

Рейтинг@Mail.ru