浏览模式: 普通 | 列表
分类: 无趣的技术 | 1 | 2 | 3 | 4 | 5 | >

窗体内引用控件导致无法释放 [私人]

[ 2009-06-29 00:24:09 | 作者: progame ]
Option Explicit

Dim c As CommandButton

Private Sub Form_Load()
Set c = Me.Command1
End Sub

就行了

解决办法在unload中set c = nothing

An event was unable to invoke any of the subscribers [私人]

[ 2009-06-01 00:10:49 | 作者: progame ]
Automation error -2147220991
An event was unable to invoke any of the subscribers

要重现, 很简单
class1:
Option Explicit

Private WithEvents m_Form As Form

Private m_Self As Class1

Public Sub Bind(f As Form)
Set m_Form = f
Set m_Self = Me
End Sub

Private Sub m_Form_Unload(Cancel As Integer)
Set m_Self = Nothing
Set m_Form = Nothing
End Sub

form:
Dim i As Long
Dim c(1000) As Class1

For i = 0 To 255
Set c(i) = New Class1
c(i).Bind Me
Next i

事件订阅居然还有上限, 真是受不了

vb6升级到vb.net? 小心!

[ 2008-10-06 22:56:22 | 作者: progame ]
这些天在搞堪比火箭和飞船的系统对接, 话说打虎亲兄弟, 上阵父子兵, VB6, C#, VB.Net一齐上, 好一番鸡飞狗跳真热闹

Com Class, Interop Forms Toolkit, MS毕竟不止顾着宠小儿子, 也给那些大的留了些活路, 现在用来效果还真不错, 使得VB6有老树开花第二春的感觉了, 有了庞大的framework类库, 有了更庞大的易于反编译的第三方组件和类库, 生活又开始阳光灿烂起来了, 开发效率还是.Net高了很多很多, 但是弄着弄着发现一个问题了

因为调用了scriptcontrol执行脚本, 但没有format函数, 于是用addobject加入了一个自定义类的实例, 里面的format函数其实转而调用的是VBA.Format, 也用了这么久, 现在迁移到VB.Net, 却发现gloal.miscrosoft.visiualbaisic.format函数和原来的VBA.format行为太不一致了, 心想, 这下如何是好? 傻眼了!

google吧, 找到一个, 还行, 效率是差点, 但将就能用:
 Function Format(vExpression, sFormat)
 
 set fmt = CreateObject("MSSTDFMT.StdDataFormat")
 fmt.Format = sFormat
 
 set rs = CreateObject("ADODB.Recordset")
 rs.Fields.Append "fldExpression", 12 ' adVariant
 
 rs.Open
 rs.AddNew
 
 set rs("fldExpression").DataFormat = fmt
 rs("fldExpression").Value = vExpression
 
 Format = rs("fldExpression").Value
 
 rs.close: Set rs = Nothing: Set fmt = Nothing
 
 End Function

msn登录只有进程没有界面的解决方法 [私人]

[ 2008-09-26 19:30:47 | 作者: progame ]
禁用网络连接 再打开 有显示界面 但是一连上 马上又无响应
最后进IE选项, 进行reset, 再打开 OK了

后来又出问题了 至今没搞定 还是用xp自带的windows messenger吧

但是用这个, 一是联系人不能搜索, 二是原来的聊天记录没法共用
狠狠心, 再搜索吧
tetra19

Junior Member with 1 posts.

The answer is simple, simply unplug your router wait 30 seconds replug it, then try
Make sure you have no msnmgr in task manager, then start up msn and it should work

I had the same problem and this fixed it
Hope it works for you!

问题解决

chm文件索引和查找无效的解决方案 [私人]

[ 2008-08-31 12:42:01 | 作者: progame ]
有很长一段时间了, CHM文件打开后索引(Index)列表显示为空白, 搜索也没有作用, 终于受不了, 网上找了一下解决方案
>I'd recommend that you run MJ's Help Diagnostics,
available from:

>http://helpware.net/downloads/index.htm#MJs

http://helpware.net/downloads/index.htm#MJs

Description:
MJ's Diagnostics is a small utility that reports if all the HTML Help runtime DLLs are installed and registered correctly. If a DLL is not registered then it will ask if you want to register it. It also checks the RoboHelp DLL (HHActiveX.dll) and MS Help 2 DLLs.

运行后搞定了, 应该是组件没有正常注册, 可能是给第三方软件给弄的

Winform内存泄露是如此容易的一件事 [私人]

[ 2008-08-17 16:20:30 | 作者: progame ]
一直以为.net年代内存管理已经不用操心了, 可是没想到连最普通的Menu, ToolStrip也得显式调用Dispose释放资源才行
还有WebBrowser, 也得这样, 而且如果在窗体构造函数而不是Load中Navigate, 那么就是直接Webbrowser.Dispose也释放不了

要显式释放也行, 但你得告诉人一声啊, DevExpress的XtraGrid也得显式调用Dispose, 虽然Control都实现了IDispable接口, 可是如果你不调用
Form的Dispose调用是不顶用的, 只能自己处理, 像我这样一知半解的肯定有很多人, 估计这世上有大量的Winform程序都内存泄露着

VS2008 IDE的状态栏居然找不回来了

[ 2008-06-13 13:23:34 | 作者: progame ]
一直也没怎么注意, 在webservice不便调试的情况下, 看出错信息找行号时才下意识地去看状态栏(我代码窗口都不显示行号的), 结果发现状态栏不见了

reset windows layout, reset toolbar, reset keyboard, 发现都不好用, 最后搜索了一下
工具--〉导入和导出设置--〉重置所有设置
(Tools->Import and Export Settings->Reset all settings)

这才搞定, 可能是被什么插件安装导致的问题, 也有可能是vs2008 sp1安装后产生的, 不确定了
被改变也不全是坏事, 当然在这里不是好事, 也有改得面目全非的, 比如

有人提议要重拍三国演义, 大家说到如何选演员, 结果这位说:
赵本山演吕布,郭德纲演典韦,SHE演刘关张。。。。。。

想想就是一部超强喜剧片, 如果真能用武林外传的恶搞精神, 把人拉来拍一拍, 就是我们广大观众的眼福了...

C#枚举所有sql server数据库实例

[ 2008-03-30 16:06:58 | 作者: progame ]
这是官方解决方案 从 SqlDataSourceConverter 即可得到MS是如何去取得所有数据库服务器的
 DataTable dataSources = SqlClientFactory.Instance.CreateDataSourceEnumerator().GetDataSources();
 DataColumn column2 = dataSources.Columns["ServerName"];
 DataColumn column = dataSources.Columns["InstanceName"];
 DataRowCollection rows = dataSources.Rows;
 string[] array = new string[rows.Count];
 for (int i = 0; i < array.Length; i++)
 {
 string str2 = rows[i][column2] as string;
 string str = rows[i][column] as string;
 if (((str == null) || (str.Length == 0)) || ("MSSQLSERVER" == str))
 {
 array[i] = str2;
 }
 else
 {
 array[i] = str2 + @"\" + str;
 }
 }
 Array.Sort<string>(array);

注意, 不仅仅是SERVER, 一台服务器上的多个实例(instance)都可以得到

给闲置的内存找点活干

[ 2008-01-29 21:24:05 | 作者: progame ]

一般情况下, 系统的2G内存是用不了的, 大多数时间是在800M以内, 再加上我已经弃暗投明的换XP系统了, 所以内存是很宽裕的.

但硬盘实在是性能瓶颈, 5400转的硬盘极慢, 而且还声音大, 不稳定, 用HDTunes测试的那条曲线就跟过山车一样忽上忽下, 于是还是找个把内存虚拟成硬盘的软件用用吧

查了一下, 大家都比较喜欢RamDisk, 真是小巧好用又实惠, 于是划了512M内存给这个虚拟硬盘, 然后把IE临时文件夹, 系统临时目录都指到了这个新分区下, 性能有没有提升不知道, 反正任务管理器里的内存占用是显著上去了, 心里总算平衡些, 否则2G内存用不到1G那是何等的铺张浪费, 这种可耻的行为简直可以和公费吃喝相媲美了

大块头未必有大智慧, 有些非常好用的软件不但尺寸小, 而且界面也简单, 减肥除了爱美的女士, 也应该是我们软件开发者们的向往

using用用还是蛮好的

[ 2008-01-16 19:14:34 | 作者: progame ]

因为考虑到数据库要支持sqlite, 而且数据访问层本身就是不允许并发的, 原因在于DataReader的连接不可断性, 所以我有一个全局的类去得到Session, 一旦得到, 马上自动开启事务, 而这个方法是通过lock来锁定防止并发, 如果session仍然在事务中, 则等待到事务完成才可以访问

得到session可以直接把事务开启, 但事务还得显式关闭, 每个地方都来一次关闭事务也挺烦的, 于是干脆加了一个DBContext类, 实现IDispose接口, 在释放时去关闭事务, 现在用起来感觉就很拉风了:

using (var context = new DBContext())
{
return context.Session.GetList(Domain.Category.Type == (int)type);
}

因为要加一个using在外面, 这样也就让自己不得不去尽量写短小点的函数, 否则括起来就很难看了