我有一个 form里面有多个 Image,假设20个吧如果我用 Timer 定时
for 来逐个 LoadfromStream() 更新图片(大小都一样),从而产生动画效果.问题是:逐个更新好象是,执行N次,Image的 绘制,显示,下一个.......
这样运行结果每个Image的图片限制时间,会有细微差异.
我想了个办法不知道是否可行,如果可行该怎么做.
我的办法是,  锁定窗口更新
for 逐个Loadfromstream()
解锁窗口///////////////////////
不知道如何锁定

解决方案 »

  1.   

    我希望用 TImage,因为我需要从鼠标点击判断是点了哪个Image
    我是自己把一堆TImage一次性建立,放进 TList保管,用到的时候用 for逐个更新图片
      

  2.   

    编程结构:
     1)程序
     2)图片目录  
        a10000010.jpg
        a10000011.jpg
        a10000012.jpg
        a10000013.jpg
        a10000014.jpg
        a10000015.jpg
    在程序中用控件Timer,随机生成"文件名",并读取相关的"图片文件"
      

  3.   

    3楼理解错误了,我现在需要的不是怎么读图片或者其他我现在需要的是,如何才能把 让Timer定时刷新的时候,每个Image不出现时间上的误差如果我用
    for 来对每个Image刷新图片按系统的理解,他肯定是 逐个 Image的读取图片->显示,然后下一个Image.........我希望是只读取图片,或者在内存中作画(反正不是直接显示在屏幕上)
    等所有的Image更新完毕后,一次全部显示出来
    就像,
    锁定form的画布
    逐个image作画
    解锁画布-->显示
      

  4.   

    Timer 的精度不高,还有更好的时间控制方法。
      

  5.   

    可以使用synchronize或者临界区
    下面是几个例子
    procedure procedure1
    begin 
    (你的绘图方法)
    end; Synchronize(procedure1); 临界区例子
    unit Unit1;
     interface
     uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     type
      TForm1 = class(TForm)
       ListBox1: TListBox;
       Button1: TButton;
       procedure FormCreate(Sender: TObject);
       procedure FormDestroy(Sender: TObject);
       procedure Button1Click(Sender: TObject);
      end;
     var
      Form1: TForm1;
     implementation
     {$R *.dfm}
     uses SyncObjs;
     var
      CS: TCriticalSection;
     function MyThreadFun(p: Pointer): DWORD; stdcall;
     var
      i: Integer;
     begin
      CS.Enter;
      for i := 0 to 99 do Form1.ListBox1.Items.Add(IntToStr(i));
      CS.Leave;
      Result := 0;
     end;
     procedure TForm1.Button1Click(Sender: TObject);
     var
      ID: DWORD;
     begin
      CreateThread(nil, 0, @MyThreadFun, nil, 0, ID);
      CreateThread(nil, 0, @MyThreadFun, nil, 0, ID);
      CreateThread(nil, 0, @MyThreadFun, nil, 0, ID);
     end;
     procedure TForm1.FormCreate(Sender: TObject);
     begin
      ListBox1.Align := alLeft;
      CS := TCriticalSection.Create;
     end;
     procedure TForm1.FormDestroy(Sender: TObject);
     begin
      CS.Free;
     end;
     end.
      

  6.   

    使用 Timer,其实我对时间控制精确度要求不是很高,我只要他不停的给我执行某一段语句.我只有一个主线程,没搞什么多线程.所以临界区该放在哪儿??我现在希望的就是form在我每次更新一系列Image的时候,或者说所有image更新完了,一次显示出来就行了.
    不用每个Image更新图片,显示,下一个image更新图片,又显示....每次每个Image画到窗口上的时候,都是有时差的,因为是逐个画上去的.我希望锁定,不画,一次画好,然后显示
      

  7.   

    但是不知道怎么锁住窗口的绘图.
    锁定form的画布   //不知道用什么代码  就是这里!!!目的不让下面的Image.load之后就显示到屏幕上
                     //因为直接显示的话,会有时间差的
    image1.loadfromfile('x.jpg');
    image2.loadfromfile('x.jpg');
    .....
    ....
    ....
    解锁画布-->显示  //
      

  8.   

    我主要是不想用 DX 写
    直接用VCL做而已如果用DX写的话,主要是一大堆类啥的要建,麻烦
    而且我实现的功能比较简单,没必要用大炮打蚊子
      

  9.   

    我的程序可以实现呀,你下载一下,这个DEMO是不是你要的呀???
    图片随机显示实例DEMO
    不过,你的给我两分呀
    http://download.csdn.net/source/3401795
      

  10.   

    我只要一个代码,如果有我就给分.如何做到 锁定窗口绘图,等所有Image都更新完毕,再一次画出所有Image感觉还是不对,反正不知道是不是表达的问题似乎我想错了??如果一次画出所有Image,还是有先后顺序??除非用 DX的Surface ?  头大了,迷惘了........
      

  11.   

    .gif 也可以,但是要是图片是用户定义的,就不知是多少,这样就不行了呀
      

  12.   

    如果图片很大的话,肯定会有延迟的。重要的缩短你点击之后开始显示到全部显示的时间差。
    先把所有的图片读入内存后,再刷到image。有一定的作用,但不能彻底解决问题。
      

  13.   

    我已经把图片放入内存了,用 LoadfromStream 了,其实显示速度是很快就是一张一样的图片在比如100x100大小的,在20个Image同时显示出来每次更新你会感觉每个Image都有时间差,并不是同时刷出来的原因因该是
    Image1.loadfromstream();
    Image2.loadfromstream();
    ..
    ..
    每个Image.load后直接显示到屏幕上,
    我希望只Load先不显示到屏幕上,等所有的都Load后同时显示
      

  14.   

    用一个image,全部画到内存再显示出来,根据点击的坐标判断是哪个图片
    麻烦点。
      

  15.   

    这样的话不是麻烦一点,是麻烦很多,首先多少张图,需要在那个Image上画多少次,还要定位坐标的画.
    可能还要缩放,还要根据点的位置来判断点了哪个图~~~麻烦,有没有简单点的
      

  16.   

    下面是一个笨方法:同一个位置摆2个image,等后面image全部准备好,前面的visiable:=false,后面的visiable:=true;
    这样麻烦一些,是不是能快点。
      

  17.   

     listview 最快的是使用它的 onData 方法
      

  18.   

    请问大家,有没有办法把 窗口的刷新暂停,等所有 image都在内存中更新完毕的时候 在刷新窗口有么有办法,有谁知道的,请告诉一下
      

  19.   

    可以看看这个消息WM_PAINT
    http://baike.baidu.com/view/1988590.htm
      

  20.   

    有具体的做法吗??Delphi的拦截WM_PAINT怎么做呢
      

  21.   

    今天花了一天时间把 连续调用20个Image更新图片  改成,连续20次对 Image的Draw,画入20张内存图片.结果悲剧了,速度更慢!!!!!!!!!!!不知道是不是我做错了每次更新图片从不用的memorystream导入TJpegImage,然后复制到窗口的某一规定位置,需要20次画入.原来那个是20个Image从不同的MemoryStream导入图片, 都有自动缩放.我用 GetTickTime测试了一下,结果使用20个Image的方式,时差是 0,而画20次的时差是157!!!!
    对了,虽然上面的是0,但是还是有时差的,2个方式的 CPU占用都很猛!!25%,我的机器是 I5 750的!天啊,谁能再给我点思路啊,难道真的要我去用 DX画才能速度快点?