baolong@...:怎样用Delphi编程实现报表的打印预览?
李海:在Delphi中有一个报表工具ReportSmith,它可以生成数据库的报表,在Visual Basic中也有一个类似的工具Crystal Report,两者都支持打印预览。这两个工具做出来的报表可能不太符合中国人的习惯。如果你想自己编写打印预览程序,也是很简单的。大多数程序的打印预览都是用如下的方法实现的:先在内存中用CreateMetaFile函数建立一个图元文件(metafile),该函数返回图元文件的hDC,然后通过WIndows GDI向该文件输出文字和图形,最后在屏幕上使用PlayMetaFile函数显示该图元文件的内容,即可实现打印预览。对于Delphi来说,已经有了很多控件可以更简单地实现这一切。你可以在ftp.cdrom.com/.22/delphi/ftp/d10free目录中找到打印预览控件。
上海 张振宇:我用Borland C++编写了一个非常简单的Windows应用程序,运行后只生产一个空的窗口,经编译所生成的EXE文件有100多K,我已经在编译时关闭了那些会使EXE文件变大的选项,还有什么办法能使EXE文件变小呢?
李海: 你没有说明是否使用了OWL类库。OWL类库封装了Windows API的很多内容,这样才使编程变得简单,但同时也会使简单的程序变得很庞大,但OWL有一个特点:当你只有一个空的窗口,经编译所生成的EXE文件有100多K,而如果有两三个窗口,它可能还是只有100多K,这也算是面向对象设计的一个特点吧。类似的情况在Delphi、Visual C++中也是存在的。如果没有使用OWL类库,那么可能是因为使用了调试选项,如果你的程序可以在Borland C++中进行调试,那么在EXE文件的尾部肯定带有调试信息,这可以使文件多出近100K,你可以让Borland C++在链接时不要加上调试信息,当然这样你就不能在Borland C++中进行源代码调试了。
上海 张振宇:哪里有免费的制作Windows 3.x setup程序的应用软件?
李海:你可以在SimTel找到很多免费的或共享的制作Windows 3.x setup程序的应用软件。你还可以在http://www.winsite.com/search用install作为关键字搜索此类工具。此类工具在Internet上是比较多的,但功能差别很大,有的编程能力强,有的比较强调易用性。有个商业软件的站点也值得一去。它是Wise
Install的站点(http://www.wise.com/),象HotDog
Pro、CuteFTP都是用Wise Install制作的,你可以从其站点下载Demo版本。
如果对安装程序的要求比较低,比如只是向用户询问安装路径和在安装后显示Readme文件,那么WinZip(http://www.winzip.com)和Drag
and Zip制作的自释放文件也可以考虑。
杭州 许吉:我用Borland C++ 4.5编写了一些Windows应用程序,用到了对话框资源,但当对话框的风格(style)选为BorDlg或GRAY-BorDlg时,如果不把BC 4.5打开,运行该程序将不能显示对话框,而如果什么风格也不选(即默认Windows 3.1风格),程序却可以正常运行。这是怎么回事?是否要将一些DLL拷贝到程序所在目录或\Windows\System\目录下?
李海:BorDlg或GRAY-BorDlg是借助BWCC.DLL(32位版本为BWCC32.DLL)来实现的。BWCC.DLL可以实现许多Borland风格的控制,比如图形按钮、检查框、单选框等等。这个文件已经被安装在你的\Windows\System\目录下了。BC
4.5集成环境在运行时会自动地调入这个DLL,所以你的程序可以正常运行。你应该在程序显示对话框之前(通常是在WinMain()函数中)加入下列语句:
doublew@...:我用C++编写Win 95的文本编辑程序时发现用Windows的EDIT类无法显示从.TXT文件中读出的内容,是这么回事吗?
李海:Windows的EDIT类可以显示从.TXT文件中读出的内容,因为Win 95的NotePad就是使用的Windows的EDIT类编写的。我们知道在Windows 3.x中EDIT类对文件大小有限制:不能超过64K。尽管Win 95是一个32位系统,但其EDIT类对可编辑文件大小也有限制。我认为你所遇到的问题可能是因为文件太大或在读文件时存在问题。
linhai@...:我在用BC++ 4.0编写Win 3.x程序时遇到如下错误: Linker Warning: Attempt to export non-public symbol WndProc. 我在函数原型和函数定义中加上了"_export"但没用。另一条错误是: Linker Warning: Stack size is less than 1400h.这是什么意思?如何解决问题呢?
李海:这两条都是警告,它们一般不会产生严重的后果,您最终仍然可以得到EXE文件。前一条通常是因为你在.DEF文件中将WndProc标注为EXPORT,而该符号在程序中没有定义或拼写错误。后一条是因为.DEF文件中STACKSIZE语句设置的堆栈太小了,一般这个数可以设为5120。如果堆栈太小,Borland C++往往会自动选择合适的数值。
汕头 王超:如何在VB 4.0程序中确定Win 95的语种?能否通过某些API获得?
李海:可以有很多办法来确定Win 95的语种,采用何种方法要看你的目的。如果你想知道货币、时间格式等语种信息,可以访问WIN.INI的[Intl]节,其中iCountry表示国家代码,sCountry表示国家名称。如果你想获得当前Win 95的语言版本,可以使用Win32 API的GetOEMCP函数获得当前系统的国家代码。但要注意:如果你的程序依赖于某个特定的DLL,它支持的语种可能与当前系统的语种不同,因为某些软件(特别是微软的软件)可能会安装一些版本比较新的DLL到用户的系统中,通常这些DLL是英文版的,而用户使用的系统可能是中文版的,所以检测某个DLL的语言版本可以使用WIndows API的GetFileVersionInfo函数。如果你只是想知道Win 95是否支持双字节,可以使用WIndows API的GetSystemMetrics(SM_DBCSENABLED)。
宁波 薛启康:如何用VB或VC对中文Win 95及NT的注册文件进行读写?需调用哪些API接口?
李海:Win 95及NT的注册数据库(Registry)是系统中非常重要的组成部分。在Win32 API中有一组Reg函数来处理这些问题。其一般的读写过程如下:
char szBuff[80]; LONG cb; HKEY hkStdFileEditing; if (RegOpenKey(HKEY_CLASSES_ROOT, "NewAppDocument\\protocol\\StdFileEditing", &hkStdFileEditing) == ERROR_SUCCESS) { cb = sizeof(szBuff); if (RegQueryValue(hkStdFileEditing, "handler", szBuff, &cb) == ERROR_SUCCESS && lstrcmpi("nwappobj.dll", szBuff) == 0) RegDeleteKey(hkStdFileEditing, "handler"); RegCloseKey(hkStdFileEditing); }
你还可以在www.active-x.com找到几个用来读写注册数据库的控制。这样可能会更方便。
如果你使用Visual Basic 4.0(32位版本)或5.0,它有GetSetting、SaveSetting和DeleteSetting命令,这组命令也是对注册数据库进行读写,但其起始位置为HKEY_CURRENT_USER\Software\VB,而不能读写整个数据库。
此外,Minudel Luca使用Visual Basic 4.0编写了一个EasyRegistry的DLL(免费),你可以从http://www.geocities.com/SiliconValley/Vista/4041下载。
如果您有任何建议,请给我发电子邮件:
。
版权所有 李海,热情软件屋 1997-2006