我做了个主窗体,放了一些图片(四十个图标),程序运行的时候占掉13%的内存。
我电脑是376M内存, 也没有包括很多的引用单元, 为什么占这么多内存, 
有什么办法吗?这些图标动态加载可以减少内存吗? 如果动态加载这些图标放先在哪里。

解决方案 »

  1.   

    不会吧,那我们4MB的exe运行不也照样运行呀,没事
      

  2.   

    只要加入就有内存占用,动态加与和静态在内存中有太大区别吗?区别只是在文件大小一级吧,我的那个4MB的可执行文件在所有图片都动态载入后,文件只有1MB大小,不过内存没有少用多少,除非你用一个加一个,不用一个就释放一个,那个才能少用一点,Windows系统本身会调整内存使用量(或用不用磁盘缓存),没事的,在内存少的机子上一样用,不过太少的就会慢点吧了
      

  3.   

    用资源文件啊!先做一个.rc的文本文件然后用brcc32.exe编译
    然后在将编译后的.res文件加载到.dpr中即可!
      

  4.   

    楼上的,能具体点吗? 我用的是.bmp文件
      

  5.   

    有没有查看每一个form占用内存的工具。
      

  6.   

    回复人: xueyin(雪莹) ( ) 信誉:100  2002-11-06 11:33:00  得分:0 
     
     
      我就做了一个窗体,里面有四十多个图标。
      
    呵呵,算你狠。一个窗口有必要放那么多图标吗?太花哨了把
      

  7.   

    哪里狠,其实我说放了四十个,应该是六十个。刚才数了一下。好了,如果这个问题不能解决, 那我想问一下,哪位知道有没有检测内存的工具,我想知道每个form占用多大内存。
      

  8.   

    看看吧,可能对你有用
    Dephi中资源文件的创建和使用--------------------------------------------------------------------
    几乎每个Windows应用程序都使用图标、图片、光标等资源。资源是程序的一部分,但是它是不可执行代码。下面我们就详细介绍资源文件在Delphi5中建立和使用方法。 
    1.把资源放到Exe文件的优点 
    由于定位资源比在磁盘中定位文件花费时间少,所以应用程序执行会更快。多种资源可以放在一个文件中,减少了图标、图片、光标等文件数量。保存资源文件时不要和工程名相同,因为Delphi创建工程时会自动创建一个和工程名相同的资源文件。并且最好将资源文件保存到和工程文件同一个文件夹中。 
    2.创建资源文件 
    首先创建一个.Rc的纯文本文件。格式如下: 
    资源标识符 + 关键字 + 资源文件名 
    ① 资源标识符:程序中调用资源时的特殊标号; 
    ② 关键字:标识资源文件类型; 
    Wave: 资源文件是声音文件; 
    RCDATA: JPEG文件; 
    AVI: AVI动画; 
    ICON: 图标文件; 
    BITMAP: 位图文件; 
    CURSOR: 光标文件; 
    资源文件名:资源文件名; 
    ③ 资源文件名:编译的资源文件,比如动画、位图、光标等; 
    ④ 如:MyWav WAVE "FileName.Wav" 
    使用Borland资源编译器(BRCC32.EXE)转化.Rc文件成.Res文件。在DOS命令行下输入下列命令: 
    Brcc32 FileName.Rc // Brcc32.Exe在Delphi5\Bin文件下。 
    3.在工程中引用资源文件 
    为了存取我们的资源文件,必须告诉Delphi链接我们的资源文件到应用程序中。因此我们可以在源代码中加入一条编译指令完成上述功能。这条指令必须紧跟在窗口指令后,如下形式: 
    {$R *.DFM} //Delphi自带编译指令 
    {$R FileName.Res} //新加入的编译资源文件的指令。 
    不要删除{$R *.DFM}指令,因为这行代码告诉Delphi链接下面的资源到窗口的资源中。 
    4.调用资源文件 
    (1)存取资源文件中的位图(Bitmap) 
    程序中如果想存取资源,你必须调用一些Windows API函数。保存在资源文件中的位图、光标和图标可以通过调用LoadBitmap、LoadCursor和LoadIcon函数存取。 
    本例举例说明如何存取资源文件中位图并显示在Timage控件中。 
    procedure TfrMain.btnCanvasPic(Sender: TObject); 
    Image1.Picture.Bitmap.Handle :=LoadBitmap(hInstance, '资源标识符'); 
    end; 
    注:如果位图没有装载成功,程序仍旧执行,但是Image将不再显示图片。你可以根据LoadBitmap函数的返回值判断是否装载成功,如果装载成功返回值是非0,如果装载失败返回值是0。 
    另外一个存取显示位图的方法如下 
    procedure TfrMain.btnLoadPicClick(Sender: TObject); 
    begin 
    Image1.Picture.Bitmap.LoadFromResourceName(hInstance, '资源标识符'); 
    end; 
    (2)存取资源文件中的光标 
    Screen.Cursors[]是一个光标数组,使用光标文件我们可以将定制的光标加入到这个属性中。因为默认的光标在数组中索引值是0,所以除非想取代默认光标,最好将定制的光标索引值设为1。 
    procedure TfrMain.btnUseCursorClick(Sender: TObject); 
    begin 
    Screen.Cursors[1] :=LoadCursor(hInstance,'资源标识符'); 
    Image1.Cursor :=1; 
    end; 
    (3)存取资源文件中的图标 
    将图标放在资源文件中,可以实现动态改变应用程序图标。 
    procedure TfrMain.LoadIconClick(Sender: TObject); 
    begin 
    Application.Icon.Handle := LoadIcon(hInstance, '资源标识符'); 
    End; 
    (4)存取资源文件中的AVI 
    procedure TfrMain.LoadIconClick(Sender: TObject); 
    begin 
    Animate1.ResName :='MyAvi' ; //资源标识 
    Animate1.Active :=True ; 
    End ; 
    (5)存取资源文件中的JPEG 
    把jpeg单元加入到Interface的uses单元中。 
    procedure TForm1.LoadJPGClick(Sender: TObject); 
    var 
    Fjpg : TJpegImage ; 
    FStream :TResourceStream ; 
    begin 
    Fjpg :=TJpegImage.Create ;  
    FStream := TResourceStream.Create (Hinstance,'资源标识符',RT_RCDATA) ; 
    FJpg.LoadFromStream (FStream) ; 
    Image1.Picture.Bitmap.Assign (FJpg); 
    end; 
    (6)存取资源文件中的Wave 
    把MMSystem加入到Interface的uses单元中 
    procedure TForm1.LoadWaveClick(Sender: TObject); 
    begin 
    PlaySound('MyWav', HInstance, Snd_ASync or Snd_Memory or snd_Resource) ; 
    end; 
    5.结束语 
      位图、光标和图标、AVI动画、JPEG和Wave文件等可以放到资源文件中,上面我们介绍了如何将资源加入到资源文件中,并介绍了在Delphi中动态存取资源文件的方法。Delphi编译工程会自动创建一个和工程名相同的资源文件(如果没有其他的资源,主窗口的图标会放在这个资源文件中)。但是建议最好不要改变这个资源文件。 
      

  9.   

    楼上的这样做,会不会减少内存的占用。 如果把图片写到.dll里面会是什么样的。