unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, jpeg, ExtCtrls, Menus;type
  TfMain = class(TForm)
    Image1: TImage;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    PopupMenu1: TPopupMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    NA: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    NB: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    NC: TMenuItem;
    N7: TMenuItem;
    Timer1: TTimer;
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure N7Click(Sender: TObject);
    procedure N1Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    index:integer;   //标识列表框中的条目序号
    order:Boolean;   //播放顺序标识位
                     //1:顺序;0:逆序
    { Private declarations }
  public
    { Public declarations }
  end;var
  fMain: TfMain;implementationuses Unit2,Unit3;{$R *.dfm}//退出
procedure TfMain.BitBtn2Click(Sender: TObject);
begin
  Close;
end;//列表管理
procedure TfMain.BitBtn1Click(Sender: TObject);
begin
  //显示界面隐藏
  hide;
  //列表图像界面
  fList.Show;
end;//默认值设置
procedure TfMain.N7Click(Sender: TObject);
begin
  //从第一个图像文件开始播放
  index:=0;
  //顺序播放
  Order:=True;
  //关闭定时器
  Timer1.Enabled:=False;
  //设定定时器时间间隔为1秒
  Timer1.Interval:=150;
  //"运行"命令屏蔽
  N1.Enabled:=False;
  //可以暂停
  N2.Enabled:=true;
  //可以加速
  N3.Enabled:=true;
  //可以减速
  N4.Enabled:=true;
  //"顺序播放"命令屏蔽
  N5.Enabled:=false;
  //可以逆序播放
  N6.Enabled:=true;
  //"恢复默认值"命令屏蔽
  N7.Enabled:=false;
  //打开定时器
  Timer1.Enabled:=true;
end;//运行
procedure TfMain.N1Click(Sender: TObject);
begin
  //"运行"命令屏蔽
  N1.Enabled:=False;
  //可以暂停
  N2.Enabled:=true;
  //可以加速
  N3.Enabled:=true;
  //可以减速
  N4.Enabled:=true;
  //若已经为顺序播放,则屏蔽顺序播放,反之亦然。
  if Order then
  begin
    //"顺序播放"命令屏蔽
    N5.Enabled:=false;
    //可以逆序播放
    N6.Enabled:=true;
  end
  else
  begin
    //"逆序播放"命令屏蔽
    N6.Enabled:=false;
    //可以顺序播放
    N5.Enabled:=true;
  end;
  //可以恢复默认值
  N7.Enabled:=true;
  //打开定时器
  Timer1.Enabled:=true;
end;//暂停
procedure TfMain.N2Click(Sender: TObject);
begin
  Timer1.Enabled:=False;
  //只允许"运行"命令
  N1.Enabled:=True;
  N2.Enabled:=false;
  N3.Enabled:=false;
  N4.Enabled:=false;
  N5.Enabled:=false;
  N6.Enabled:=false;
  N7.Enabled:=false;
end;//加速
procedure TfMain.N3Click(Sender: TObject);
begin
  if Timer1.Enabled then
  begin
    //暂时终止运行
    Timer1.Enabled:=false;
    //加速最快到50毫秒
    if Timer1.Interval>50 then
    begin
      //每次加速以50毫秒为一个间隔单位
      Timer1.Interval:=Timer1.Interval-50;
      //允许再次加速
      N3.Enabled:=true;
    end;
    if Timer1.Interval<=50 then
    begin
      //一旦速度小于50毫秒,则不运行加速,只允许减速
      N3.Enabled:=false;
      N4.Enabled:=true;
    end;
    //打开定时器
    Timer1.Enabled:=true;
  end;end;//减速
procedure TfMain.N4Click(Sender: TObject);
begin
  if Timer1.Enabled then
  begin
    //暂时终止运行
    Timer1.Enabled:=false;
    //减速最慢到10秒
    if Timer1.Interval<10000 then
    begin
      //每次减速以50毫秒为一个间隔单位
      Timer1.Interval:=Timer1.Interval+50;
      //允许再次减速
      N4.Enabled:=true;
    end;
    if Timer1.Interval>=10000 then
    begin
      //一旦速度大于10秒,则不运行减速,只允许加速
      N4.Enabled:=false;
      N3.Enabled:=true;
    end;
    //打开定时器
    Timer1.Enabled:=true;
  end;
end;//顺序播放
procedure TfMain.N5Click(Sender: TObject);
begin
  //设定标识位
  Order:=true;
  //关闭"顺序播放",开启"逆序播放"
  N5.Enabled:=false;
  N6.Enabled:=true;
end;//逆序播放
procedure TfMain.N6Click(Sender: TObject);
begin
  //设定标识位
  Order:=false;
  //关闭"逆序播放",开启"顺序播放"
  N6.Enabled:=false;
  N5.Enabled:=true;
end;//定时器响应事件
procedure TfMain.Timer1Timer(Sender: TObject);begin
      //列表中一定要有内容
  if fList.ListBox1.Count>0 then
  begin
    if Order then
    begin
      //顺行
      if index<fList.ListBox1.Count-1 then
        index:=index+1
      else
        index:=0;
    end
    else
    begin
      //逆行
      if index>0 then
        index:=index-1
      else
        index:=fList.ListBox1.Count-1;
    end;
    //获得图片
    image1.Picture.LoadFromFile(fList.ListBox1.Items[index]);
    fMain.Canvas.Draw(0,0,Image1.Picture.Graphic);
    if index=2 then
    Form3.show  end
  else
  begin
    Timer1.Enabled:=false;
    Image1.Picture:=nil;
   // showmessage('该动画没有图像列表,请添加文件!');
  end;
end;end.

解决方案 »

  1.   

    unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Buttons, ExtDlgs;type
      TfList = class(TForm)
        ListBox1: TListBox;
        BitBtn1: TBitBtn;
        BitBtn2: TBitBtn;
        BitBtn3: TBitBtn;
        StaticText1: TStaticText;
        OpenPictureDialog1: TOpenPictureDialog;
        BitBtn4: TBitBtn;
        procedure BitBtn1Click(Sender: TObject);
        procedure BitBtn2Click(Sender: TObject);
        procedure BitBtn3Click(Sender: TObject);
        procedure BitBtn4Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      fList: TfList;implementationuses Unit1;{$R *.dfm}//增加
    procedure TfList.BitBtn1Click(Sender: TObject);
      var
      s:string;
      dirstr:string;
      keyword:string;
     rc:TSearchRec;
     found:integer;
     {
    var
      //获得图像文件名
      FName:string;
      //标志位,标志当前选取的图像文件是否重复选择
      IsValid:Boolean;
      i:integer;
         }
    begin
      dirstr:='C:\图像动画系统\'; //任意目录
    keyword:='*.jpg'; //关键字
    s:=dirstr+Trim(keyword);
    found:=findfirst(s,faAnyFile,rc);
    while found=0 do
    begin
              listbox1.Items.Add(ExtractFileName(rc.Name)); //do samething...
              found:=FindNext(rc);
    end;  
    end;
    //删除选定的文件名
    procedure TfList.BitBtn2Click(Sender: TObject);
    var i:integer;
    begin
         listbox1.Items.add('001宾馆正门.jpg');
         listbox1.Items.add('002白云楼正门.jpg');
         listbox1.Items.add('003.JPG');
         listbox1.Items.add('004.JPG');
         listbox1.Items.add('005净慧楼.JPG');
         listbox1.Items.add('006六榕楼.JPG');
         listbox1.Items.add('007.JPG');
         listbox1.Items.add('008.JPG');
         listbox1.Items.add('009.jpg');
         listbox1.Items.add('010.jpg');
         listbox1.Items.add('011碧海楼正门.jpg');
         listbox1.Items.add('012碧海楼外夜景.jpg');
         listbox1.Items.add('014碧海餐厅美华厅.JPG');
         listbox1.Items.add('015碧海餐厅越华厅.jpg');
         listbox1.Items.add('016碧海楼秀华厅.jpg');
    end;//确定
    procedure TfList.BitBtn3Click(Sender: TObject);
    begin
      //列表界面隐藏
      hide;
      //显示图像界面
      fMain.Show;
    end;//取消
    procedure TfList.BitBtn4Click(Sender: TObject);
    begin
      ListBox1.Clear;
      application.Terminate;
    end;end.
      

  2.   

    问题可能出在 LoadFromFile 后面紧跟着 Draw。装载需要一定时间。LoadFromFile 是异步函数,它返回时有可能加载还未完成,这时候 Draw 就会出问题。不妨把 Draw 放在 TImage 的一个事件例程中试试,例如 OnChange, OnProgress 这类事件。
      

  3.   

    另外,你的图片似乎没必要重绘一遍。直接用一个 TImage 对象在窗口上全覆盖,然后把图片加载给它就行了。再一点,如果图片不太多,而且可以事先确定,也可用若干 TImage 对象(如果图片都一般大,还可用 TImageList)把图片预存起来编译进 EXE 文件中。这样处理起来能快很多。
      

  4.   

     image1.Picture.LoadFromFile(fList.ListBox1.Items[index]);
       // fMain.Canvas.Draw(0,0,Image1.Picture.Graphic);
    依然是播放到第十四张出错...........
      

  5.   

    如果是这样,你不妨在 Timer 事件例程中设个断点,然后单步跟踪,看看究竟走到哪一步出问题。为了简化跟踪,可以在断点处加个条件判断,让断点一下子抓住第14张图片,然后再单步跟踪。
      

  6.   

    http://download.csdn.net/detail/longai123/5048037
    真的不会找出原因了。昨天搞了一天累了各位大神能帮我看下是什么原因未。
    改好后发到我[email protected]
    急啊。4号就要拿出去晚会展示
      

  7.   

    http://download.csdn.net/detail/longai123/5048037
    上面是我做的程序。累了搞不出原因。。
    谁能帮帮我啊。。
      

  8.   

    运行程序提示access violation at address的解决方法
    http://www.jb51.net/softjc/55595.html
      

  9.   

    都说了那用这么麻烦?在Image里Load一遍还要在Canvas画一遍,这不是浪费资源么?
      

  10.   

    我用的都是5M以上的图片, 测试过程中, cpu和内存都没异常
      

  11.   


    软件测试要旨之一:程序任何部分都可能出错。也许这句话对你有用。其实,你要是跟踪到 LoadFromFile 这里出错,就可以立即断定:不是你的图片有问题,就是 Delphi 有问题。
      

  12.   

    http://download.csdn.net/detail/longai123/5053476
    http://download.csdn.net/detail/longai123/5053447
    图片已上传了。。哪位大神帮下我。。花了半个小时上传。。
    1将照片放在C:\图像动画系统目录下....这个我写死左
    一定要将照片和照片2放在C:\图像动画系统目录下
    因为是播放到第十三或第十张出错。。
    小女子在此谢过了....
      

  13.   


    难道LZ色诱?? :)用楼主的可执行文件, lz的7张照片, 运行N久, 没出错...
    LZ你把程序放到别人电脑上试试, 出错不.
      

  14.   


    LZ注意看我15,16楼的回复, 我用自己的图片(5M以上)60多张图片轮换没有报异常20楼也做了测试建议...
      

  15.   


    CSDN 也兴男扮女装呀?以后俺得小心了,喊错了性别对不住人家。
      

  16.   


    直接用你的可执行程序, 出错用D7/D XE打开你的项目不做修改编译, 执行不出错   :)你使用的图片大小差异较大, 切换不流畅
    我试着做了个数据缓冲, 效果好很多, 显示比较平滑.如果楼主只能用d6的话, 做以下优化试试, 那条能解决问题采纳那条:
    1  将多个图片文件的大小控制在较小范围(你提供的图片大的14m, 小的700k, 这样展示是效果不好);2 在加载图片时, 做个锁定和延时
    ----------------------------------------
    //定时器响应事件
    procedure TfMain.Timer1Timer(Sender: TObject);
    begin
        //列表中一定要有内容
      if fList.ListBox1.Count>0 then
      begin
        if Order then
        begin
          //顺行
          if index<fList.ListBox1.Count-1 then
            index:=index+1
          else
            index:=0;
        end
        else
        begin
          //逆行
          if index>0 then
            index:=index-1
          else
            index:=fList.ListBox1.Count-1;
        end;    //获得图片
        try
          image1.Picture.LoadFromFile(fList.ListBox1.Items[index]);
          fMain.Canvas.Lock;
          fMain.Canvas.Draw(0,0,Image1.Picture.Graphic);
          fMain.Canvas.Unlock;
          Sleep(100);
        except on E: Exception do
          ShowMessage(e.Message);
        end;
      end
      else
      begin
        Timer1.Enabled:=false;
        Image1.Picture:=nil;
        showmessage('该动画没有图像列表,请添加文件!');
      end;
    end;3 如果图片大小和数量你无法控制, 最好做个数据缓冲以保证切换的流畅性
    ======================================
    PS : 所提建议本人都做了相关测试, 但不能保证一定可以解决LZ遇到的问题
      

  17.   

    52张图片有七张播放是有问题的。。都不知为什么会这样的呢。。
    公司年会已过。。用flash播放。。
    哪位大神能帮我分析下原因。。小女子以身相许..............
      

  18.   


    早听人说,码农堆里的女孩儿日子过得像公主,今日领教了。
    既然已不急用,何不自己好好研究下?那能学到更多。
    我用 Fireworks 把 014 和 016 另存了下,再播放就没问题了。你自己试试吧。
    把压缩率增大些,图片能小很多,画面看上去并无多大差别。顺便问下:挺好的宾馆,为何那个静慧楼弄得如此破败?
      

  19.   

    有问题的图片的模式都有问题,即正常的为RGB,而有问题的都是CMYK格式的图片。
    CMYK图片如果宽度超过SCREEN的宽度较多时,就会出错。
      

  20.   

    我也测试过楼主的软件,真的没有问题,只是014-016的图片,有问题,有可能这两个图片是BMP或JPEG文件 直接修改扩展名所致,把他用ACDSee 5.0另存为 JPG文件就正常了!
    另 题外话,图片展显,直接用ACDSee 就可了。为何要写软件做呢??除非是作业没有办法!!