大家帮忙看看错在那?(d6 develeper's guide's instance)
 提示说:invalid class typecast  procedure TMainForm.sbPlayClick(Sender: TObject);
var
  B: TBlobStream;
  M: TMemoryStream;
begin
  B:= TBlobStream.Create(adotable1Wave, bmRead); // create blob stream
  Screen.Cursor := crHourGlass;                   // wait hourglass
  try
    M := TMemoryStream.Create;                    // create memory stream
    try
      M.CopyFrom(B, B.Size);             // copy from blob to memory stream
      // Attempt to play sound.  Raise exception if something goes wrong
      Win32Check(PlaySound(M.Memory, 0, SND_SYNC or SND_MEMORY));
    finally
      M.Free;
    end;
  finally
    Screen.Cursor := crDefault;
    B.Free;                                       // clean up
  end;
end;

解决方案 »

  1.   

    adotable1wave字段是保存的是*。wav文件,sbPlayClick是播放按钮
      

  2.   

    一般采用sndPlaySound播放wav文件,同时你也要引用uses MMSystem才可以播放,你把Win32Check(PlaySound(M.Memory, 0, SND_SYNC or SND_MEMORY))改为Win32Check(PlaySound(M.Memory, 0, SND_ASYNC));看看
      

  3.   

    还是不行,原程序如下,是不是blobstream 与memorystream 类型转换的问题?
    unit Main;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ExtCtrls, DBCtrls, DB, DBTables, StdCtrls, Mask, Buttons, ComCtrls, ADODB;type
      TMainForm = class(TForm)
        dsSounds: TDataSource;
        edTitle: TDBEdit;
        edFileName: TDBEdit;
        Label1: TLabel;
        Label2: TLabel;
        OpenDialog: TOpenDialog;
        SaveDialog: TSaveDialog;
        pnlToobar: TPanel;
        sbPlay: TSpeedButton;
        sbAdd: TSpeedButton;
        sbSave: TSpeedButton;
        sbExit: TSpeedButton;
        Bevel1: TBevel;
        dbnNavigator: TDBNavigator;
        stbStatus: TStatusBar;
        ADOTable1: TADOTable;
        ADOTable1Wavetitle: TWideStringField;
        ADOTable1Filename: TWideStringField;
        ADOTable1id: TAutoIncField;
        ADOTable1wave: TBlobField;
        procedure sbPlayClick(Sender: TObject);
        procedure sbAddClick(Sender: TObject);
        procedure sbSaveClick(Sender: TObject);
        procedure sbExitClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        procedure OnAppHint(Sender: TObject);
      end;var
      MainForm: TMainForm;implementation{$R *.DFM}uses MMSystem;procedure TMainForm.sbPlayClick(Sender: TObject);
    var
      B: TBlobStream;
      M: TMemoryStream;
    begin
      B:= TBlobStream.Create(adotable1Wave, bmRead); // create blob stream
      Screen.Cursor := crHourGlass;                   // wait hourglass
      try
        M := TMemoryStream.Create;                    // create memory stream
        try
          M.CopyFrom(B, B.Size);             // copy from blob to memory stream
          // Attempt to play sound.  Raise exception if something goes wrong
          Win32Check(PlaySound(M.Memory, 0, SND_ASYNC));//or SND_MEMORY));//试过了,不行
        finally
          M.Free;
        end;
      finally
        Screen.Cursor := crDefault;
        B.Free;                                       // clean up
      end;
    end;procedure TMainForm.sbAddClick(Sender: TObject);
    begin
      if OpenDialog.Execute then
      begin
        adotable1.Append;
        adotable1['FileName'] := ExtractFileName(OpenDialog.FileName);
        adotable1Wave.LoadFromFile(OpenDialog.FileName);
        edTitle.SetFocus;
      end;
    end;procedure TMainForm.sbSaveClick(Sender: TObject);
    begin
      with SaveDialog do
      begin
        FileName := adotable1['FileName'];    // initialize file name
        if Execute then                       // execute dialog
          adotable1Wave.SaveToFile(FileName); // save blob to file
      end;
    end;procedure TMainForm.sbExitClick(Sender: TObject);
    begin
      Close;
    end;procedure TMainForm.FormCreate(Sender: TObject);
    begin
      Application.OnHint := OnAppHint;
      adotable1.Open;
    end;procedure TMainForm.OnAppHint(Sender: TObject);
    begin
      stbStatus.SimpleText := Application.Hint;
    end;procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      adotable1.Close;
    end;end.