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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #121  
Старый 20.08.2012, 13:24
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Пока что у меня проблемы с записью данных в memo1. Можете посмотреть на код и сказать что сделать, что бы данные шли в своем порядке. А то ни как не могу сделать красиво и ровно. должно быть так:
Код:
RIFF
chunkSize 2194
WAVE
fmt 
subchunk1Size 16
audioFormat 1
numChannels 1
sampleRate 22050
byteRate 44100
blockAlign 2
bitsPerSample 16
data
subchunk2Size 2158
А оно все так:
Код:
RIFF
WAVE
fmt 
16
data
2158
audioFormat 0001
numChannels 1
sampleRate 22050
byteRate 44100
blockAlign 2
bitsPerSample 16
В приведённом коде я вообще не вижу где идёт вывод в Memo1 кроме этих двух строчек:
Код:
    Form1.memo1.Lines.Add(RiffChunk.RiffSign);
    Form1.memo1.Lines.Add(RiffChunk.WaveSign);
И кроме того этим двум строчкам не место в процедуре ReadWavInfo, так как эта процедура абстрагирована от элементов управления. Выводить нужно в методе формы, например в ButtonClick. И Form1 в нём указывать не нужно.


Цитата:
Сообщение от Dmitry_DM
Так же отмечу, что не могу найти 2 значение chunkSize. Не вывести, не мне даже понять, в каком месте оно читается.
А зачем его выводить? В информационных целях чтоли?

Размер чанка 'RIFF' читается здесь:
Код:
    fs.ReadBuffer(RiffChunk, SizeOf(RiffChunk));
А размер внутренних чанков ('fmt ', 'data' и остальных если есть) читаются здесь:
Код:
fs.ReadBuffer(Chunk, SizeOf(Chunk));
Ответить с цитированием
  #122  
Старый 21.08.2012, 17:29
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

к сожалению у меня ничего не получилось. ChunkZize я так и не смог найти, вернее смог, но он = 12, а должен быть 2194. В мемо1 вывести все удалось, но никак не по порядку. Наверное лучше интегрировать нахождение Samples и NumSemples из вашей версии в мою программу. Хотя я уже пробовал (в самый первый раз). Выводились нули. Я не знаю, что мне делать...
Ответить с цитированием
  #123  
Старый 21.08.2012, 18:13
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
к сожалению у меня ничего не получилось. ChunkZize я так и не смог найти, вернее смог, но он = 12, а должен быть 2194.
Хм... А как искали?
Цитата:
Сообщение от Dmitry_DM
В мемо1 вывести все удалось, но никак не по порядку.
Всё же я не пойму какой смысл выводить в Memo всё подряд? Вот даже слова 'RIFF', 'WAVE'. Да и размеры чанков собственно зачем выводить-то?
Цитата:
Сообщение от Dmitry_DM
Наверное лучше интегрировать нахождение Samples и NumSemples из вашей версии в мою программу. Хотя я уже пробовал (в самый первый раз). Выводились нули. Я не знаю, что мне делать...
У меня же никакие нули не выводились. У меня вобще получались полностью идентичные файлы с оригиналами когда я открывал те 2 файла которые вы прикрепили во вложении (хотя в общем случае полная идентичность не гарантируется).
Ответить с цитированием
  #124  
Старый 21.08.2012, 18:31
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Хм... А как искали?
Всё же я не пойму какой смысл выводить в Memo всё подряд? Вот даже слова 'RIFF', 'WAVE'. Да и размеры чанков собственно зачем выводить-то?
У меня же никакие нули не выводились. У меня вообще получались полностью идентичные файлы с оригиналами когда я открывал те 2 файла которые вы прикрепили во вложении (хотя в общем случае полная идентичность не гарантируется).
На этот счет все понятно. С этим проблем нету. Структура, чтение, запись wav, я считаю, удачно обработана. Теперь, если вы знаете, что такое ординаты звукового файла и как по ним построить график? И что такое гистограмма wav файла?

Последний раз редактировалось Dmitry_DM, 22.08.2012 в 01:32.
Ответить с цитированием
  #125  
Старый 22.08.2012, 01:31
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Последнее, что я хочу на счет чтение wav. Та версия программы, что вы мне кинули, она читает и записывает wav одной и той же кнопкой. Но я бы хотел, что бы читалось buttonClickk1, а записывалось buttonClick4. Козалось бы куда проще это сделать, но нет! Вот так я сделал, вроде должно было работать, но файл создается 44 байт. При этом я запретил выполнение этой строчки:
Код:
if WavInfo.WaveFormat.wFormatTag = WAVE_FORMAT_PCM then

Как поправить код для выполнения вышеописанного?
Хотелось бы еще узнать зачем та строчка, ведь с ней, в данном коде ниже, не нажимается кнопка buttonClick4 вообще.
Код:
Код:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus, sSkinManager, ImgList, Inifiles, ComCtrls,
  sTabControl, acHeaderControl, sGauge, sPageControl, sMemo, sButton,
  sLabel, sEdit;
Const
  noError            = 0;
  ReadError          = 1;
  HeaderError        = 2;
  DataError          = 3;
  FileCorrupt        = 4;
  IncorectFileFormat = 5;
  WAVE_FORMAT_PCM    = 1;
type
  TForm1 = class(TForm)

    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    N11: TMenuItem;
    N12: TMenuItem;
    sSkinManager1: TsSkinManager;
    ImageList1: TImageList;
    SaveDialog2: TSaveDialog;
    TabSheet1: TsTabSheet;
    TabSheet2: TsTabSheet;
    Memo1: TsMemo;
    Memo2: TsMemo;
    Memo3: TsMemo;
    Button1: TsButton;
    Button2: TsButton;
    Button3: TsButton;
    Button4: TsButton;
    Button5: TsButton;
    Button6: TsButton;
    OpenDialog2: TOpenDialog;
    PageControl1: TsPageControl;
    Edit1: TsEdit;
    Edit2: TsEdit;
    Label1: TsLabel;
    Label2: TsLabel;
    Lable3: TsLabel;
    Label4: TsLabel;
    Label5: TsLabel;
    Label6: TsLabel;
    Label7: TsLabel;
    Label8: TsLabel;
    Label9: TsLabel;
    Label10: TsLabel;
    Label11: TsLabel;


    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure N8Click(Sender: TObject);
    procedure N9Click(Sender: TObject);
    procedure N10Click(Sender: TObject);
    procedure N11Click(Sender: TObject);
    procedure N12Click(Sender: TObject);
    { Private declarations }
  public
    { Public declarations }
end;
type
  EWavError = class(Exception);
 
  TWaveFormat = packed record
    wFormatTag: Word;
    nChannels: Word;
    nSamplesPerSec: DWORD;
    nAvgBytesPerSec: DWORD;
    nBlockAlign: Word;
    wBitsPerSample: Word;
  end;

  TWavInfo = record
    WaveFormat: TWaveFormat;
    Samples: array of array of Word;
  end;

var
  Form1: TForm1;
  TxtFile : TextFile;
  i : integer;
  s1: String;
  s2: integer;
  Ini:Tinifile;
  language:string;

implementation

{$R *.dfm}
{$R WindowsXP.res}

uses math, Unit2;

procedure RaiseWavError(const Msg: string);
begin
  raise EWavError.Create(Msg);
end;
 
procedure ReadWavInfo(const FileName: string; var WavInfo: TWavInfo);
type
  TChunkName = packed array[0..3] of AnsiChar;
 
  TRiffChunk = packed record
    RiffSign: TChunkName;
    RiffSize: Longword;
    WaveSign: TChunkName;
  end;
 
  TChunk = packed record
    Name: TChunkName;
    Size: Longword;
  end;
 
var
  fs: TFileStream;
  RiffChunk: TRiffChunk;
  Chunk: TChunk;
  FmtPos, DataPos, NewPos: Int64;
  DataSize, NumSamples, BytsPerSample, I, J: Longword;
 
  procedure DecRiffSize(Size: Longword);
  begin
    if RiffChunk.RiffSize < Size then RaiseWavError('Wav-файл повреждён');
    Dec(RiffChunk.RiffSize, Size);
  end;
 
begin
  Finalize(WavInfo);
  FillChar(WavInfo, SizeOf(WavInfo), 0);

  fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
  try
    fs.ReadBuffer(RiffChunk, SizeOf(RiffChunk));
    if (RiffChunk.RiffSign <> 'RIFF') or (RiffChunk.WaveSign <> 'WAVE') then RaiseWavError('Это не wav-файл');
 
    DecRiffSize(SizeOf(RiffChunk.WaveSign));
 
    FmtPos := 0;
    DataPos := 0;
 
    while RiffChunk.RiffSize > 0 do
    begin
      fs.ReadBuffer(Chunk, SizeOf(Chunk));
      DecRiffSize(SizeOf(Chunk));
      DecRiffSize(Chunk.Size);
 
      if Chunk.Name = 'fmt ' then
      begin
        if FmtPos <> 0 then RaiseWavError('Встретилось несколько секций "fmt"');
        if Chunk.Size < SizeOf(WavInfo.WaveFormat) then RaiseWavError('Неверный размер секции "fmt"');
        FmtPos := fs.Position;
      end else
        if Chunk.Name = 'data' then
        begin
          if DataPos <> 0 then RaiseWavError('Встретилось несколько секций "data"');
          DataPos := fs.Position;
          DataSize := Chunk.Size;
        end;
 
      NewPos := fs.Position + Chunk.Size;
      fs.Position := NewPos;
      if fs.Position <> NewPos then RaiseWavError('Wav-файл повреждён');
    end;
 
    if FmtPos = 0 then RaiseWavError('Отсутствует секция "fmt"');
 
    if DataPos = 0 then RaiseWavError('Отсутствует секция "data"');
 
    fs.Position := FmtPos;
    fs.ReadBuffer(WavInfo.WaveFormat, SizeOf(WavInfo.WaveFormat));

    if WavInfo.WaveFormat.wFormatTag = WAVE_FORMAT_PCM then
    begin
      if WavInfo.WaveFormat.nChannels = 0 then RaiseWavError('Отсутствуют каналы');
      BytsPerSample := WavInfo.WaveFormat.wBitsPerSample div 8;
      if BytsPerSample = 0 then RaiseWavError('Неверная разрядность сэмплов');
      NumSamples := DataSize div (BytsPerSample * WavInfo.WaveFormat.nChannels);

      SetLength(WavInfo.Samples, NumSamples, WavInfo.WaveFormat.nChannels);
      fs.Position := DataPos;

      for I := 1 to NumSamples do
      begin
        for J := 1 to WavInfo.WaveFormat.nChannels do
        begin
          fs.ReadBuffer(WavInfo.Samples[I - 1, J - 1], BytsPerSample);
        end;
      end;
    end;
 
  finally
    fs.Free;
  end;
end;

procedure  TForm1.Button1Click(Sender: TObject);
var
  WavInfo: TWavInfo;

begin
  if OpenDialog1.Execute then
  begin
    ReadWavInfo(OpenDialog1.FileName, WavInfo);


    Memo1.WordWrap := False;
    Memo1.Lines.Add('Файл: ' + OpenDialog2.FileName);
    Memo1.Lines.Add('Формат: ' + IntToHex(WavInfo.WaveFormat.wFormatTag, 1));
    Memo1.Lines.Add('Каналов: ' + IntToStr(WavInfo.WaveFormat.nChannels));
    Memo1.Lines.Add('Сэмплов: ' + IntToStr(Length(WavInfo.Samples)));
    Memo1.Lines.Add('Частота дискретизации: ' + IntToStr(WavInfo.WaveFormat.nSamplesPerSec) + ' сэмплов в секунду');
    Memo1.Lines.Add('Разрядность сэмплов: ' + IntToStr(WavInfo.WaveFormat.wBitsPerSample) + ' бит');
end;
end;




procedure WriteWav(const FileName: string; const WavInfo: TWavInfo);
type
  TChunkID = packed array[0..3] of Char;

  THeader = packed record
    ChunkID: TChunkID;
    ChunkSize: Longword;
    Format: TChunkID;
    Subchunk1ID: TChunkID;
    Subchunk1Size: Longword;
    AudioFormat: Word;
    NumChannels: Word;
    SampleRate: Longword;
    ByteRate: Longword;
    BlockAlign: Word;
    BitsPerSample: Word;
    Subchunk2ID: TChunkID;
    Subchunk2Size: Longword;
  end;
 
var
  Header: THeader;
  NumSamples, BytsPerSample, Sample, I, J: Longword;
  fs: TFileStream;
begin
  NumSamples := Length(WavInfo.Samples);

  BytsPerSample := WavInfo.WaveFormat.wBitsPerSample div 8;
 
  Header.ChunkID := 'RIFF';
  Header.Format := 'WAVE';
  Header.Subchunk1ID := 'fmt ';
  Header.Subchunk1Size := 16;
  Header.AudioFormat := WAVE_FORMAT_PCM;
  Header.NumChannels := WavInfo.WaveFormat.nChannels;
  Header.SampleRate := WavInfo.WaveFormat.nSamplesPerSec;
  Header.BitsPerSample := BytsPerSample * 8;
  Header.BlockAlign := Header.NumChannels * BytsPerSample;
  Header.ByteRate := Header.SampleRate * Header.BlockAlign;
  Header.Subchunk2ID := 'data';
  Header.Subchunk2Size := NumSamples * Header.BlockAlign;
  Header.ChunkSize := Header.Subchunk2Size + SizeOf(Header) - 8;
 
  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[I - 1, J - 1], BytsPerSample);
      end;
    end;

  finally
    fs.Free;
  end;
end;

procedure TForm1.Button4Click(Sender: TObject);
var
  WavInfo: TWavInfo;

    {if WavInfo.WaveFormat.wFormatTag = WAVE_FORMAT_PCM then }
    begin
      if SaveDialog2.Execute then
      begin
        WriteWav(SaveDialog2.FileName, WavInfo);
      end;
    end;
 {end; }
{end; }
End.

P.S. Хотелось бы просто так спросить, для интереса, чем отличается packed record от record?
Ответить с цитированием
  #126  
Старый 22.08.2012, 01:45
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Код:
MyRecord = record
  Field : Byte;
end;
В зависимости от настроек может быть 2 байта (Word), 4 байта (DWORD)
Код:
MyRecord = packed record
  Field : Byte;
end;
1 - байт
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
Dmitry_DM (22.08.2012)
  #127  
Старый 22.08.2012, 09:24
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Последнее, что я хочу на счет чтение wav. Та версия программы, что вы мне кинули, она читает и записывает wav одной и той же кнопкой. Но я бы хотел, что бы читалось buttonClickk1, а записывалось buttonClick4. Козалось бы куда проще это сделать, но нет! Вот так я сделал, вроде должно было работать, но файл создается 44 байт.
Переменная WavInfo объявленная в Button1Click и переменная WavInfo объявленная в Button4Click это совершенно разные переменные. Т.е. вы сохраняете информацию о wav-файле в одной переменной, а пытаетесь её прочитать из другой. Это всё равно чтобы записать информацию в одну тетрадь и потом удивляться почему она не читается из другой тетради.
Цитата:
Сообщение от Dmitry_DM
При этом я запретил выполнение этой строчки:
Код:
if WavInfo.WaveFormat.wFormatTag = WAVE_FORMAT_PCM then

Как поправить код для выполнения вышеописанного?
Хотелось бы еще узнать зачем та строчка, ведь с ней, в данном коде ниже, не нажимается кнопка buttonClick4 вообще.
Так как процедура WriteWav умеет создавать wav-файлы только в формате PCM, то перед тем как её вызвать и делается эта проверка. И эта проверка не проходит так как переменная WavInfo пустая (точнее в ней находится мусор), так как информация об wav-файле была прочитана в совершенно другую переменную с таким же именем.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Dmitry_DM (22.08.2012)
  #128  
Старый 22.08.2012, 11:23
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Переменная WavInfo объявленная в Button1Click и переменная WavInfo объявленная в Button4Click это совершенно разные переменные. Т.е. вы сохраняете информацию о wav-файле в одной переменной, а пытаетесь её прочитать из другой. Это всё равно чтобы записать информацию в одну тетрадь и потом удивляться почему она не читается из другой тетради.Так как процедура WriteWav умеет создавать wav-файлы только в формате PCM, то перед тем как её вызвать и делается эта проверка. И эта проверка не проходит так как переменная WavInfo пустая (точнее в ней находится мусор), так как информация об wav-файле была прочитана в совершенно другую переменную с таким же именем.
Все ясно и понятно. Спасибо за просвящение!
Ответить с цитированием
  #129  
Старый 22.08.2012, 11:36
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Переменная WavInfo объявленная в Button1Click и переменная WavInfo объявленная в Button4Click это совершенно разные переменные. Т.е. вы сохраняете информацию о wav-файле в одной переменной, а пытаетесь её прочитать из другой. Это всё равно чтобы записать информацию в одну тетрадь и потом удивляться почему она не читается из другой тетради.
А как теперь оформить процедуру чтение на button1? Вероятней всего так:
Код:
procedure  TForm1.Button1Click(Sender: TObject);
Var
WaveFormat: TWaveFormat;
begin
  if OpenDialog1.Execute then
  begin
    WaveFormat := ReadWavInfo(opendialog1.FileName);



    Memo1.WordWrap := False;
    Memo1.Lines.Add('Файл: ' + OpenDialog2.FileName);
    Memo1.Lines.Add('Формат: ' + IntToHex(WavInfo.WaveFormat.wFormatTag, 1));
    Memo1.Lines.Add('Каналов: ' + IntToStr(WavInfo.WaveFormat.nChannels));
    Memo1.Lines.Add('Сэмплов: ' + IntToStr(Length(WavInfo.Samples)));
    Memo1.Lines.Add('Частота дискретизации: ' + IntToStr(WavInfo.WaveFormat.nSamplesPerSec) + ' сэмплов в секунду');
    Memo1.Lines.Add('Разрядность сэмплов: ' + IntToStr(WavInfo.WaveFormat.wBitsPerSample) + ' бит');
end;
end;
Но ошибка в недостачи параметров. Я что-то упустил?
Ответить с цитированием
  #130  
Старый 22.08.2012, 11:45
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
А как теперь оформить процедуру чтение на button1? Вероятней всего так:
Код:
procedure  TForm1.Button1Click(Sender: TObject);
Var
WaveFormat: TWaveFormat;
begin
  if OpenDialog1.Execute then
  begin
    WaveFormat := ReadWavInfo(opendialog1.FileName);
...
end;
end;
Но ошибка в недостачи параметров. Я что-то упустил?
ReadWavInfo это процедура а не функция. Процедура (в отличие от функции) не возвращает результат (Result).
Ответить с цитированием
  #131  
Старый 22.08.2012, 11:52
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
ReadWavInfo это процедура а не функция. Процедура (в отличие от функции) не возвращает результат (Result).
И как теперь сделать все правильно?
Ответить с цитированием
  #132  
Старый 22.08.2012, 12:04
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Чувак, лучше закажи в разделе работа или попроси, чтоб сразу все за тебя сделали.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #133  
Старый 22.08.2012, 12:05
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
И как теперь сделать все правильно?
Перед этим в обработчике Button1Click было сделано правильно. Единственно, что там нужно было объявить переменную WavInfo не локально, а глобально (чтобы её видели оба обработчика и Button1Click и Button4Click). Можно просто объявить её там же где объявлена Form1, но лучше объявлять как поле внутри класса TForm1 (правда для этого нужно ещё перенести объявление типа TWavInfo выше обявления класса TForm1). Ну и соответственно в обработчике Button4Click тоже использовать эту же переменную вместо локально объявленной.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Dmitry_DM (22.08.2012)
  #134  
Старый 22.08.2012, 12:10
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Чувак, лучше закажи в разделе работа или попроси, чтоб сразу все за тебя сделали.
Я так понял, что Dmitry_DM от Delphi (и вообще от программирования) далёкий. Даже не знаю как он будет дальше программировать шифрование wav-файлов которое он хочет реализовать...
Ответить с цитированием
  #135  
Старый 22.08.2012, 13:09
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Перед этим в обработчике Button1Click было сделано правильно. Единственно, что там нужно было объявить переменную WavInfo не локально, а глобально (чтобы её видели оба обработчика и Button1Click и Button4Click). Можно просто объявить её там же где объявлена Form1, но лучше объявлять как поле внутри класса TForm1 (правда для этого нужно ещё перенести объявление типа TWavInfo выше обявления класса TForm1). Ну и соответственно в обработчике Button4Click тоже использовать эту же переменную вместо локально объявленной.
Это помогло. Спасибо! Все работает. А на счет того, что я не смыслю в delphi, скажу: думайте что хотите. Я ведь перед этим проектом сделал более 20 маленьких программ, даже браузер на базе IE. Правда я его закинул, так как перспективы нету. Но он работал. И я думаю вы тоже не сразу стали опытным программистом. Я то сообщение воспринял как "отшивание". Не очень то гуманно... Но, ради Бога...
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter