KingSunSha,zswang等高手进来看看,内存方面的。有兴趣的高手谈谈解决办法。谢谢!在线讨论。

hammer_shi 2002-06-20 05:35:01
我们用delphi做的模块,由于模块上需要摆放的Combobox较多所以消耗的内存较大,最大的一个模块需要占用30M的内存,而这还是个主模块下面的一个模块。你们有没有什么解决的好办法呀?谢谢。




/*************************************/
/*1、MY TOOL:*************************/
/*2、Delphi,Oracle,Sybase,C++/C*******/
/*3、PROJECT:*************************/
/*3、Boss*****************************/
/*4、为了五星的目标希望你早点结贴*********/
/*5、在线技术讨论(QQ):68123095*********/
/*************************************/
...全文
53 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
Borlandor 2002-06-21
  • 打赏
  • 举报
回复
邪了,有毒了!
windindance 2002-06-21
  • 打赏
  • 举报
回复
我猜想是你的程序中使用了数据库,同时打开的数据过多。或者是使用了大量的图片等等资源。

另外:请不要使用过长的签名。
Forren 2002-06-21
  • 打赏
  • 举报
回复
没有什么问题,我加了90个(看起来颇为壮观,呵呵),内存使用显示3348K.
manboo 2002-06-21
  • 打赏
  • 举报
回复
可能是数据太多了,combobox每什么的!
surfguy 2002-06-21
  • 打赏
  • 举报
回复
我觉得是你的代码的问题,不至于30个combobox就耗掉那么多内存。
hammer_shi 2002-06-21
  • 打赏
  • 举报
回复
最后一次讨论这个话题.首先谢谢大家关注。
我上面说的很清楚,在测试的时候我界面上除了Combobox外没有其他控件。
里面也没有任何代码。所以你们大部分答非所问。我们也测试了,要是我们把
操作系统换成Win2000的话,还是那个版本的Delphi 5,那样内存消耗仅3M.
这个问题也不是非解决不可,只是时常到CSDN上来就给大家看看。当然能解决更好。

至于版主说的签名,改!
以下附上和:我爱洁洁 的交流,供大家参考,在此也谢谢他的帮助!

Sorry,我记错了,D4有三个补丁,D5只有一个。
我觉得模块本身可以动态创建,不要一开始全部创建。尤其是DataModule。
----------------------------------------------------------------
原贴内容:
我们就安装了D5EntUpdate.exe这个补丁,倒是要向你请教你说的三个补丁是那三个?
顺便说说那边有下载。呵呵,要是我们模块每个都是30M内存,那就死了,加上主模块,各个营业厅的机器肯定跑不起来!
谢谢指教!


编号: 54 发送者 chechy 发送时间 2002-6-21 11:26:29 删除 回复
内容 可能是机器的问题。我的机器是win2k+D6 sp2
1、Win98下存在此种情况,打开若干Form(大概不超过100个),会导致系统资源崩溃。这也是我开发决不用Win9X的原因。
2、D5的三个补丁补齐了没有?
----------------------------------------------------------------
原贴内容:
先谢谢你的回信!
我在那上面的测试数据都是除了Combobox和Form外没有其他的组建(我们公司开发的一个控件安装在Delphi上,但是没有摆放在界面上),里面也没有任何代码,我也向其他网友求助,他们也说用的内存不多,但是我在我们公司电脑上测试都是那么多的消耗,环境一样的(也有没有安装我们公司控件的电脑)。我们的环境都是:Win98+delphi 5,你觉得这会是那里出了问题呀?谢谢!

日总是我哥 2002-06-21
  • 打赏
  • 举报
回复

还是忍不住进来看看:-)

果然是"在线"啊~~


绝不是因为ComboBox多的原因!

请检查:
1.Delphi, 是正版还是盗版?!是盗版,是不是太"盗"了点!!
2.是否还使用了其它控件?要不Renew Application试试看,如果问题照样的话,可以进一步确定第一点!
3.你说你们公司所有机器都会出现一样的问题,那么,应该不是机器的问题,可以进一步确定第一点!
3.机器是不是中毒?!我认为,即使中毒了,也跟这个程序泄内存没多大关系!
4.至于,释放问题,不是动态创建的控件,应该无需多考虑~~~

短歌如风 2002-06-20
  • 打赏
  • 举报
回复
不是ComboBox多的原因(而且也不算多)。
注意其它地方吧,一定有内存泄露。
a12345 2002-06-20
  • 打赏
  • 举报
回复
你厉害
这样的问题你也能碰上?
很可能是你代码的原因
不然delphi早垮了
stella53 2002-06-20
  • 打赏
  • 举报
回复
可我的机器上却是一点问题都没有———所以还有一种可能,中毒了。
hammer_shi 2002-06-20
  • 打赏
  • 举报
回复
哦,谢谢。我们公司差不多每台机上都是这样!并且测试时无代码!






/*************************************/
/*1、MY TOOL:*************************/
/*2、Delphi,Oracle,Sybase,C++/C*******/
/*3、PROJECT:*************************/
/*3、Boss*****************************/
/*4、为了五星的目标希望你早点结贴*********/
/*5、在线技术讨论(QQ):68123095*********/
/*************************************/
stella53 2002-06-20
  • 打赏
  • 举报
回复
我已经觉得是你的Delphi出问题了,嘿嘿,要不信,把你代码发给我。
stella53@263.net

我给你测试。
hammer_shi 2002-06-20
  • 打赏
  • 举报
回复
: stella53(慕蓉云风)

或许是你的电脑要好些,再次测试(无代码)


打开 delphi 13%
数量 增加后 运行中 关闭程序
10 42% 36% 42%
20 36% 25% 36%
30 31% 15% 31%
40 25% 4% 25%
50 21% 运行不起 关闭Delphi 68%









/*************************************/
/*1、MY TOOL:*************************/
/*2、Delphi,Oracle,Sybase,C++/C*******/
/*3、PROJECT:*************************/
/*3、Boss*****************************/
/*4、为了五星的目标希望你早点结贴*********/
/*5、在线技术讨论(QQ):68123095*********/
/*************************************/
stella53 2002-06-20
  • 打赏
  • 举报
回复
To KingSunSha:

老兄,你都懂什么???说出来讨论讨论,我想学习学习。
KingSunSha 2002-06-20
  • 打赏
  • 举报
回复
不好意思我不懂dephi,非常抱歉帮不上忙
stella53 2002-06-20
  • 打赏
  • 举报
回复
其实很简单吗,代码一贴,高手们一定能给你找出问题,毕竟这是CSDN,哈哈。
stella53 2002-06-20
  • 打赏
  • 举报
回复
所以才要看看你的调用代码,及窗口的实现代码,不然怎么能确定问题呢???

我可是试了50多个控件,运行几十遍后没问题。

机器256M,不过测试的时候可开了N多的其它应用。
stella53 2002-06-20
  • 打赏
  • 举报
回复
我在窗口上放了50多个ComboBox,在我的机器上运行了N遍,N>=20,都没有任何问题。。。
byc6352 2002-06-20
  • 打赏
  • 举报
回复
窗体退出时释放所占用的内存:
procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action:=cafree;
end;
hammer_shi 2002-06-20
  • 打赏
  • 举报
回复
To: : stella53(慕蓉云风)
呵呵,现在就这个问题。界面上除了Combobox没其他组建你说谁的原因?上面的测试数据已经说了!






/*************************************/
/*1、MY TOOL:*************************/
/*2、Delphi,Oracle,Sybase,C++/C*******/
/*3、PROJECT:*************************/
/*3、Boss*****************************/
/*4、为了五星的目标希望你早点结贴*********/
/*5、在线技术讨论(QQ):68123095*********/
/*************************************/
加载更多回复(12)
自定义窗体的最大化、最小化和关闭按钮, C#移动无标题栏窗体的三种代码: C#移动无标题栏窗体的三种代码:第一种采用,需注意窗体上的控件是否把窗体覆盖了。。。MouseDown、MouseMove、MouseUp事件应该是鼠标所处位置最顶层的控件的事件 在窗体的类中声明两个变量 private Point mouseOffset; //记录鼠标指针的坐标 private bool isMouseDown = false; //记录鼠标按键是否按下 创建该窗体 MouseDown、MouseMove、MouseUp事件的相应处理程序 private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { int xOffset; int yOffset; if (e.Button == MouseButtons.Left) { xOffset = -e.X ; yOffset = -e.Y ; mouseOffset = new Point(xOffset, yOffset); isMouseDown = true; } } private void Form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) { if (isMouseDown) { Point mousePos = Control.MousePosition; mousePos.Offset(mouseOffset.X, mouseOffset.Y); Location = mousePos; } } private void Form1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) { // 修改鼠标状态isMouseDown的值 // 确保只有鼠标左键按下并移动时,才移动窗体 if (e.Button == MouseButtons.Left) { isMouseDown = false; } } 第二种调用API 未验证 using System.Runtime.InteropServices; [DllImport("user32.dll")] public static extern bool ReleaseCapture(); [DllImport("user32.dll")] public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); public const int WM_SYSCOMMAND = 0x0112; public const int SC_MOVE = 0xF010; public const int HTCAPTION = 0x0002; private void Form1_MouseDown(object sender, MouseEventArgs e) { ReleaseCapture(); SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0); } 第三种未验证 private bool isMouseDown = false; private Point FormLocation; //form的location private Point mouseOffset; //鼠标的按下位置 [DllImport("user32.dll")] public static extern bool ReleaseCapture(); [DllImport("user32.dll")] public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); private const int WM_SYSCOMMAND = 0x0112;//点击窗口左上角那个图标时的系统信息 private const int SC_MOVE = 0xF010;//移动信息 private const int HTCAPTION = 0x0002;//表示鼠标在窗口标题栏时的系统信息 private const int WM_NCHITTEST = 0x84;//鼠标在窗体客户区(除了标题栏和边框以外的部分)时发送的消息 private const int HTCLIENT = 0x1;//表示鼠标在窗口客户区的系统消息 private const int SC_MAXIMIZE = 0xF030;//最大化信息 private const int SC_MINIMIZE = 0xF020;//最小化信息 protected override void WndProc(ref Message m) { switch (m.Msg) { case WM_SYSCOMMAND: if (m.WParam == (IntPtr)SC_MAXIMIZE) { m.WParam = (IntPtr)SC_MINIMIZE; } break; case WM_NCHITTEST: //如果鼠标移动或单击 base.WndProc(ref m);//调用基类的窗口过程——WndProc方法处理这个消息 if (m.Result == (IntPtr)HTCLIENT)//如果返回的是HTCLIENT { m.Result = (IntPtr)HTCAPTION;//把它改为HTCAPTION return;//直接返回退出方法 } break; } base.WndProc(ref m);//如果不是鼠标移动或单击消息就调用基类的窗口过程进行处理 } private void Form1_Load(object sender, EventArgs e) { } ------------------------------- 如何在窗体标题栏左边的控制菜单加入自己的菜单啊? 我们一般在窗口标题栏点右键 或 按Alt+空格 可以弹出那个菜单。 ------解决方案-------------------- using System.Runtime.InteropServices; [DllImport( "user32.dll ")] public static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert); [DllImport( "user32.dll ")] public static extern bool InsertMenu(IntPtr hMenu, uint uPosition, uint uFlags, uint uIDNewItem, string lpNewItem); public const int MF_BYCOMMAND = 0; public const int MF_STRING = 0; public const int MF_BYPOSITION = 0x400; public const int MF_SEPARATOR = 0x800; private const uint SC_ABOUT = 0x0001; public const int WM_SYSCOMMAND = 0x0112; private void Form1_Load(object sender, EventArgs e) { IntPtr vMenuHandle = GetSystemMenu(Handle, false); InsertMenu(vMenuHandle, 255, MF_STRING, SC_ABOUT, "About... "); } protected override void WndProc(ref Message m) { switch (m.Msg) { case WM_SYSCOMMAND: if ((uint)m.WParam == SC_ABOUT) { MessageBox.Show( "Zswang 路过! "); } break; } base.WndProc(ref m); }

5,391

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧