Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Мультимедиа
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #46  
Старый 31.08.2012, 11:39
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Какой массив?
Ну не только массив, я не правильно выразился. Одним словом все, что входит в WavInfo
Ответить с цитированием
  #47  
Старый 31.08.2012, 11:41
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Ну не только массив, я не правильно выразился. Одним словом все, что входит в WavInfo
А в каком месте программы в переменную WavInfo были занесены данные, чтобы в Button4Click их можно было сохранить в файл?
Ответить с цитированием
  #48  
Старый 31.08.2012, 11:42
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
А в каком месте программы в переменную WavInfo были занесены данные, чтобы в Button4Click их можно было сохранить в файл?
В этом:
Код:
fs := TFileStream.Create(FileName, fmCreate);
  try
    fs.WriteBuffer(Header, SizeOf(Header));

    for I := 1 to NumSamples do
    begin
      for J := 1 to Header.NumChannels do
      begin
        fs.WriteBuffer(WavInfo.Samples[J - 1, I - 1], BytsPerSample);
      end;
    end;
Ответить с цитированием
  #49  
Старый 31.08.2012, 11:52
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

И что из этого следует? WavInfo - переменная глобальная, ее видят все процедуры. Что не так?
Ответить с цитированием
  #50  
Старый 31.08.2012, 11:58
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
В этом:
Код:
fs := TFileStream.Create(FileName, fmCreate);
  try
    fs.WriteBuffer(Header, SizeOf(Header));

    for I := 1 to NumSamples do
    begin
      for J := 1 to Header.NumChannels do
      begin
        fs.WriteBuffer(WavInfo.Samples[J - 1, I - 1], BytsPerSample);
      end;
    end;
Нет. В этом месте читается массив из переменной WavInfo и записывается в файл. А в каком месте программы в этот массив были занесены данные, чтобы их здесь можно было записать в файл?

Цитата:
Сообщение от Dmitry_DM
И что из этого следует? WavInfo - переменная глобальная, ее видят все процедуры. Что не так?
Глобальная, но она пустая, так как в неё никто не заносит данные, а раз она пустая, то и Button4Click не может её содержимое сохранить в файл.
Ответить с цитированием
  #51  
Старый 31.08.2012, 12:08
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Нет. В этом месте читается массив из переменной WavInfo и записывается в файл. А в каком месте программы в этот массив были занесены данные, чтобы их здесь можно было записать в файл?

Глобальная, но она пустая, так как в неё никто не заносит данные, а раз она пустая, то и Button4Click не может её содержимое сохранить в файл.
Тогда, может, здесь?
Код:
 for I := 1 to NumSamples do
      begin
        for J := 1 to WavInfo.WaveFormat.nChannels do
        begin
          fs.ReadBuffer(Sample, BytsPerSample);
          case BytsPerSample of
            1: Sample := Shortint(Sample);
            2: Sample := SmallInt(Sample);
          end;
      WavInfo.Samples[J - 1, I - 1] := Sample;
      if Abs(Sample) > WavInfo.MaxAmplitude then WavInfo.MaxAmplitude := Abs(Sample);
        end;
      end;
    WavInfo.NumSamples := LongInt(NumSamples);
    end;
Ответить с цитированием
  #52  
Старый 31.08.2012, 12:16
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Тогда, может, здесь?
Код:
 for I := 1 to NumSamples do
      begin
        for J := 1 to WavInfo.WaveFormat.nChannels do
        begin
          fs.ReadBuffer(Sample, BytsPerSample);
          case BytsPerSample of
            1: Sample := Shortint(Sample);
            2: Sample := SmallInt(Sample);
          end;
      WavInfo.Samples[J - 1, I - 1] := Sample;
      if Abs(Sample) > WavInfo.MaxAmplitude then WavInfo.MaxAmplitude := Abs(Sample);
        end;
      end;
    WavInfo.NumSamples := LongInt(NumSamples);
    end;
Правильно, здесь. Только в этом месте WavInfo это никакая не глобальная переменная, а формальный параметр процедуры ReadWavInfo:
Код:
procedure ReadWavInfo(const FileName: string; var WavInfo: TWavInfo);
А фактически, здесь будет участвовать переменная, которую сюда подставит тот, кто вызовет процедуру ReadWavInfo, а вызов этой процедуры происходит здесь:
Код:
procedure  TForm1.Button1Click(Sender: TObject);
...
begin
...
      ReadWavInfo(OpenDialog1.FileName, FWavInfo);
...
end;
Итого получается следующее:
Button1Click - читает wav-файл и записывает информацию о нём в переменную FWavInfo.
Button4Click - пытается прочитать переменную WavInfo чтобы записать её содержимое в файл, но у Button4Click конечно же ничего не получается, так как в переменную WavInfo данные никто не заносил.
Ответить с цитированием
  #53  
Старый 31.08.2012, 12:23
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Правильно, здесь. Только в этом месте WavInfo это никакая не глобальная переменная, а формальный параметр процедуры ReadWavInfo:
Код:
procedure ReadWavInfo(const FileName: string; var WavInfo: TWavInfo);
А фактически, здесь будет участвовать переменная, которую сюда подставит тот, кто вызовет процедуру ReadWavInfo, а вызов этой процедуры происходит здесь:
Код:
procedure  TForm1.Button1Click(Sender: TObject);
...
begin
...
      ReadWavInfo(OpenDialog1.FileName, FWavInfo);
...
end;
Итого получается следующее:
Button1Click - читает wav-файл и записывает информацию о нём в переменную FWavInfo.
Button4Click - пытается прочитать переменную WavInfo чтобы записать её содержимое в файл, но у Button4Click конечно же ничего не получается, так как в переменную WavInfo данные никто не заносил.
Дааа, это прискорбно.. Из-за одной буквы все меняется. Только когда я делаю так
Код:
procedure  TForm1.Button1Click(Sender: TObject);
...
begin
...
      ReadWavInfo(OpenDialog1.FileName, WavInfo);
...
end;
То естественно график не рисуется. А разве переменные FWavInfo и WavInfo не должны связываться здесь?:
Код:
FWavInfo: TWavInfo;
Ответить с цитированием
  #54  
Старый 31.08.2012, 12:41
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Дааа, это прискорбно.. Из-за одной буквы все меняется. Только когда я делаю так
Код:
procedure  TForm1.Button1Click(Sender: TObject);
...
begin
...
      ReadWavInfo(OpenDialog1.FileName, WavInfo);
...
end;
То естественно график не рисуется. А разве переменные FWavInfo и WavInfo не должны связываться здесь?:
Код:
FWavInfo: TWavInfo;
Это не просто лишняя буква, это совершенно разные переменные и связи между ними нет и быть не может (всё равно что удивляться тому почему Коля не откликается на имя Оля, а ведь всего одна буква). Также как например здесь:
Код:
var
  XX, YY: Integer; // XX и YY это совершенно разные переменные и никакой связи между ними нет
Просто нужно использовать для чтения и записи одну и ту же переменную. В твоём случае достаточно просто удалить одну из (ненужных) переменных, а в том месте где компилятор будет ругаться, заменить имя удалённой переменной на имя оставшейся.
Ответить с цитированием
  #55  
Старый 31.08.2012, 12:45
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Какую-то одну? Без разници какую?
Ответить с цитированием
  #56  
Старый 31.08.2012, 12:53
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Какую-то одну? Без разници какую?
Разница конечно же есть
В частности, если переменная WavInfo это дествительно обычная глобальная переменная, то FWavInfo - это не просто переменная, а поле класса TForm1, т.е. без объекта созданного от класса TForm1 этой переменной просто не существует. И кроме того, из процедур и методов не класса TForm1, к ней нельзя обратиться напрямую, только через указание объекта, к переменной-полю FWavInfo которой необходимо обратиться.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Dmitry_DM (31.08.2012)
  #57  
Старый 31.08.2012, 13:16
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Разница конечно же есть
В частности, если переменная WavInfo это дествительно обычная глобальная переменная, то FWavInfo - это не просто переменная, а поле класса TForm1, т.е. без объекта созданного от класса TForm1 этой переменной просто не существует. И кроме того, из процедур и методов не класса TForm1, к ней нельзя обратиться напрямую, только через указание объекта, к переменной-полю FWavInfo которой необходимо обратиться.
Так и сделал. Оставил только WavInfo и все! Спасибо за помощь. Можете протестировать exe'шник? Может найдете ошибки. Только для полного эффекта красоты добавьте папку со скином в корень диска С.
Вложения
Тип файла: rar Read inf From WAV_31.08.12.rar (633.6 Кбайт, 21 просмотров)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:15.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter