Непонятки с типом (LPWAVEOUTCAPS)

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

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

Непонятки с типом (LPWAVEOUTCAPS)

Сообщение modjo » 06.12.2009 03:10:54

В общем есть вот это:
Код: Выделить всё
uses mmsystem;
var
  i: Integer;
  outinfo: LPWAVEOUTCAPS;
procedure TMainWindow.VUpClick(Sender: TObject);
begin
  for i := 0 to waveInGetNumDevs - 1 do
    begin
      waveOutGetDevCaps(i, outinfo, SizeOf(outinfo));
      ListBox1.Items.Add(outinfo.szPname);
    end;
end;

Если глянуть вот сюда http://www.freepascal.org/docs-html/pac ... vcaps.html становится понятно, что LPWAVEOUTCAPS - это запись. Результат работы waveOutGetDevCaps хочу записать в список. Но все время выдается ошибка для ListBox1.Items.Add(outinfo.szPname); :

main.pas(42,34) Error: Illegal qualifier
main.pas(42,34) Hint: may be pointer dereference is missing
main.pas(42,34) Fatal: Syntax error, ")" expected but "identifier SZPNAME" found


Может я чего-то не понимаю? В чем проблема?
modjo
новенький
 
Сообщения: 92
Зарегистрирован: 19.07.2009 15:52:10
Откуда: Москва

Re: Непонятки с типом (LPWAVEOUTCAPS)

Сообщение VirtUX » 06.12.2009 04:06:13

Правильно будет так:
Код: Выделить всё
ListBox1.Items.Add(outinfo^.szPname);
Последний раз редактировалось VirtUX 06.12.2009 04:20:37, всего редактировалось 4 раз(а).
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Непонятки с типом (LPWAVEOUTCAPS)

Сообщение modjo » 06.12.2009 04:11:52

Неа, все тоже самое.
modjo
новенький
 
Сообщения: 92
Зарегистрирован: 19.07.2009 15:52:10
Откуда: Москва

Re: Непонятки с типом (LPWAVEOUTCAPS)

Сообщение VirtUX » 06.12.2009 04:22:09

Я извиняюсь за предидущий топ - что-то видать уже сонливость сказывается :) Исправил. Все дело в ссылочном типе.
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Непонятки с типом (LPWAVEOUTCAPS)

Сообщение modjo » 06.12.2009 04:30:57

Спасибо, собралось. До этого не работал с подобными данными. Надо будет почитать на эту тему.

Теперь другая проблема. Из-за чего может вылезать access violation при ListBox1.Items.Add(outinfo^.szPname) или например s := outinfo^.szPname;?
modjo
новенький
 
Сообщения: 92
Зарегистрирован: 19.07.2009 15:52:10
Откуда: Москва

Re: Непонятки с типом (LPWAVEOUTCAPS)

Сообщение Vadim » 06.12.2009 08:19:58

modjo
Поскольку переменная outinfo это указатель, для неё надо сначала выделять память и только потом уже использовать где-нибудь. Иначе при попытке обратится к любому полю этой структуры, Вы обращаетесь просто в никуда.
Код: Выделить всё
uses mmsystem;
var
  i: Integer;
  outinfo: LPWAVEOUTCAPS;
procedure TMainWindow.VUpClick(Sender: TObject);
begin
  //Это нужно делать в первую очередь
  GetMem(outinfo, SizeOf(WAVEOUTCAPS));
  //Если Вы получаете свойства устройства вывода, то уж будьте добры и считайте кол-во устройств вывода, а не устройств ввода ;)
  for i := 0 to waveOUTGetNumDevs - 1 do
    begin
      //Прежде чем использовать результат, нужно проверять, какой именно результат получен
      If waveOutGetDevCaps(i, outinfo, SizeOf(outinfo))=MMSYSERR_NOERROR Then
        ListBox1.Items.Add(outinfo^.szPname)
      Else
        ShowMessage('Не удалось получить свойства устройства вывода звука');
    end;
end;
Последний раз редактировалось Vadim 06.12.2009 17:57:28, всего редактировалось 1 раз.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Непонятки с типом (LPWAVEOUTCAPS)

Сообщение modjo » 06.12.2009 17:25:30

Спасибо. Собирается и отрабатывает. Кстати не MMSYSTEM_NOERROR, а MMSYSERR_NOERROR.

Как я понял с этим кодом должен быть список устройств вывода, а итоге получаю дав раза Top.
После чего можно будет выбрать устройство и его уже регулировать. Только вывод какой-то неправильный.
Пока не разобрался почему.
modjo
новенький
 
Сообщения: 92
Зарегистрирован: 19.07.2009 15:52:10
Откуда: Москва

Re: Непонятки с типом (LPWAVEOUTCAPS)

Сообщение Vadim » 06.12.2009 18:07:16

modjo писал(а):Кстати не MMSYSTEM_NOERROR, а MMSYSERR_NOERROR.

Да, действительно. Описка... :) Спасибо за поправку.
modjo писал(а):Как я понял с этим кодом должен быть список устройств вывода

У меня так и есть.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Непонятки с типом (LPWAVEOUTCAPS)

Сообщение modjo » 06.12.2009 18:19:44

Может это от системы зависит? У меня 7. Где-то видел что в Vista/7 были существенные изменения в плане управления звуком.

Добавлено спустя 9 часов 57 минут 8 секунд:
В общем так и есть. Начиная с висты доступ к регулировки громкости изменился. Кажется его упростили.

Стал читать http://msdn.microsoft.com/en-us/library/dd316599(VS.85).aspx и пробовать. При использовании SetMasterVolume, например, постоянно выскакивает main.pas(52,18) Error: Identifier not found "SetMasterVolume". Что нужно прописать в uses, никто не в курсе?
modjo
новенький
 
Сообщения: 92
Зарегистрирован: 19.07.2009 15:52:10
Откуда: Москва

Re: Непонятки с типом (LPWAVEOUTCAPS)

Сообщение Vadim » 07.12.2009 06:35:54

modjo
У меня ХР. На Vist'e не пробовал, т.к. ставить её что-то неохота. :)
modjo писал(а):При использовании SetMasterVolume, например, постоянно выскакивает main.pas(52,18) Error: Identifier not found "SetMasterVolume".

А каким образом Вы её пытались использовать? Насколько я помню, это метод интерфейса, а не функция. Следовательно ни в каких модулях она и не может быть определена.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Непонятки с типом (LPWAVEOUTCAPS)

Сообщение modjo » 07.12.2009 08:46:25

Верно, это интерфейс - http://msdn.microsoft.com/en-us/library/dd316537(VS.85).aspx. В вашей фразе намек что я ее криво использую. Хм, попробую разобраться в чем косяк.
modjo
новенький
 
Сообщения: 92
Зарегистрирован: 19.07.2009 15:52:10
Откуда: Москва


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru