一个不知道原因的问题!求各位高人解答原因!(100分)

                            
unit   Unit1;   
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   StdCtrls,   mmsystem;  
   
  type  
      //GD   =   array   of   Char;  
      TForm1   =   class(TForm)  
          Button1:   TButton;  
          EdtPhoneNum:   TEdit;  
          ListBox1:   TListBox;  
          procedure   FormCreate(Sender:   TObject);  
          procedure   Button1Click(Sender:   TObject);  
      private  
          {   Private   declarations   }  
          wf   :   TWaveFormatEx;  
        mmr   :   MMRESULT;  
          Flag   :   Boolean;  
          function     VoidOutInit()   :   Boolean;  
          function   GetWavLength(FileName   :   String):   integer;  
      public  
          {   Public   declarations   }  
      end;  
   
  var  
      Form1:   TForm1;  
      WaveOutHandle   :   HWAVEOUT;  
  implementation  
   
  {$R   *.dfm}  
   
  {   TForm1   }  
   
  function   TForm1.VoidOutInit:   Boolean;  
  begin  
      wf.wFormatTag     :=   WAVE_FORMAT_PCM;  
    wf.cbSize     :=   0;  
    wf.wBitsPerSample   :=   16;  
    wf.nSamplesPerSec   :=   16000;  
    wf.nChannels   :=   1;  
    wf.nAvgBytesPerSec   :=   wf.nSamplesPerSec   *   (   wf.wBitsPerSample   div   8   );  
    wf.nBlockAlign   :=   wf.nChannels   *   (   wf.wBitsPerSample   div   8   );  
   
    mmr   :=   waveOutOpen(@WaveOutHandle,WAVE_MAPPER,@wf,self.Handle,0,CALLBACK_WINDOW);  
   
          if   mmr   <>   MMSYSERR_NOERROR   then  
          begin  
            result   :=   false;  
              exit;  
          end;  
          result   :=   true   ;  
  end;  
   
  procedure   TForm1.FormCreate(Sender:   TObject);  
  begin  
      Flag   :=   False;  
  end;  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var   ReadFile   :   file;  
          Buf   :   PWaveHdr;  
          //Temp   :   Array   of   GD;  
          Temp   :   Array   of   PChar;  
          //PlayBuffer   :   Array   of   Char;  
          PlayBuffer   :   PChar;  
          LenList   :   Array   of   integer;  
          PhoneNum   :   Array   of   Char;  
          NumRead,   i,   m,   NumCount,   BufLen,   j,x:   integer;  
          str,FileName   :   String;  
   
  begin  
      NumRead   :=   0;  
      BufLen   :=   0;  
      NumCount   :=0;  
      x   :=   0;  
      m   :=   0;  
      if   VoidOutInit   =   false   then  
      begin  
            ListBox1.Items.Add('设备打开错误!');  
            exit;  
      end;  
      str   :=   EdtPhoneNum.Text;  
   
      if   str   <>   ''   then  
      begin  
          NumCount   :=   length(str);  
          SetLength(PhoneNum,NumCount);  
          SetLength(Temp,NumCount);  
          SetLength(LenList,NumCount);  
   
          for   i   :=   0     to   (NumCount   -   1)   do  
          begin  
              PhoneNum[i]   :=   str[i+1];  
              FileName   :=   str[i+1]   +   '.wav';  
              m   :=   GetWavLength(FileName);  
              LenList[i]   :=   m;  
              BufLen   :=   BufLen   +   m;  
   
              //SetLength(Temp[i],m);  
              GetMem(Temp[i],m   +   1);  
              ZeroMemory(Temp[i],m   +   1);  
              ShowMessage(inttostr(m));  
   
              AssignFile(ReadFile,FileName);  
              Reset(ReadFile,1);  
              Seek(ReadFile,44);  
              BlockRead(ReadFile,Temp[i],m,NumRead);  
              CloseFile(ReadFile);  
          end;  
      end;  
      **//SetLength(PlayBuffer,BufLen);  
       
      **GetMem(PlayBuffer,BufLen);  
      ZeroMemory(PlayBuffer,BufLen);  
      for   i   :=   0   to   (NumCount-1)   do  
      begin  
          CopyMemory(PlayBuffer   +   x   ,Temp[i],LenList[i]);  
   
          x   :=   x   +   LenList[i];  
      end;  
      GetMem(Buf,sizeof(WaveHdr));  
      ZeroMemory(Buf,sizeof(WaveHdr));  
      GetMem(Buf.lpData,BufLen);  
      ZeroMemory(Buf.lpData,BufLen);  
   
      Buf.dwBufferLength   :=   BufLen;  
      Buf.dwFlags   :=   0;  
      Buf.dwLoops   :=   0;  
      Buf.lpData   :=   PlayBuffer;  
   
      ASSERT(waveOutPrepareHeader(WaveOutHandle,   Buf,sizeof(WAVEHDR)   )   =   MMSYSERR_NOERROR);  
      ASSERT(waveOutWrite(WaveOutHandle   ,Buf,   sizeof(WAVEHDR)   )   =   MMSYSERR_NOERROR);  
   
   
      //GetMem(FileBuf,7052);  
      //ZeroMemory(FileBuf,7052);  
   
   
      //CopyMemory(Buf.lpData,FileBuf+44,7008);  
      //Buf.lpData   :=   FileBuf   +   44;//Temp   +   44;  
   
   
   
   
      {AssignFile(ReadFile,'1.wav');  
      Reset(ReadFile,2);  
      BlockRead(ReadFile,FileBuf,7052,NumRead);  
      ASSERT(waveOutPrepareHeader(WaveOutHandle,   Buf,sizeof(WAVEHDR)   )   =   MMSYSERR_NOERROR);  
      ASSERT(waveOutWrite(WaveOutHandle   ,Buf,   sizeof(WAVEHDR)   )   =   MMSYSERR_NOERROR);  
      CloseFile(ReadFile);       }  
   
   
  end;  
   
  function   TForm1.GetWavLength(FileName   :   String):   integer;  
  var   //Head   :   Array[0..43]   of   Char;  
          ReadFile   :   file;  
          NumRead,   len   ,i:   integer;  
   
  begin  
      len   :=   0;  
      AssignFile(ReadFile,FileName);  
      Reset(ReadFile,1);  
      seek(ReadFile,40);  
      //BlockRead(ReadFile,Head,44,NumRead);  
      BlockRead(ReadFile,len,4,NumRead);  
      //CopyMemory(@len,Head   +   40,4);  
      CloseFile(ReadFile);  
      Result   :=   len;  
  end;  
   
  end.  
   
   
  这个程序是想把录有0-9   10个数字的WAVE文件随意拼接后播放出来,在Edit控件中输入数字然后进行播放,现在我用开空间的方法和开动态数组的方法都有内存读写错误!但是不知道错误出在哪!注释掉的是用动态数组方法做的!出错的地方是打*的句子!还有就是我把动态数组的名称(就是数组首地址)赋给Buf.lpData为什么说类型不一样呢!要怎么解决呢?  
   
  问题太多了!请各位专家指教!今天才发现内存操作学得太差了!谢谢大家!

查看回复