Some Delphi tips
====================================
conversion routines
====================================
Format('There are now %d records in the table %s', [10,'TableA']); -->格式化字符串
function Now(): TDateTime; --> 返回当前的日期和时间, DateTime类型(其实就是double型)
function Date(): TDateTime; --> Returns the current date.
function CompareDateTime(const A, B: TDateTime): int; -->比较2个日期
function EncodeDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word):
TDateTime; -->拼日期
procedure DecodeDateTime(const AValue: TDateTime; out AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word);
ExtractFilePath(Application.ExeName) -->获取当前程序路径
//简单类型转换
function IntToStr(Value: Integer): string;
function FloatToStr(Value: Extended): string;
Format('%d%s',[100,'hello'])
procedure DateTimeToString(var Result: string; const Format: string; DateTime: TDateTime);
function FormatDateTime(const Format: string; DateTime: TDateTime): string;
格式'yyyymmddhhnnsszzz' 是精确到毫秒的格式
FormatDateTime()和DateTimeToString() 都能很好将日期格式化成String, 但没有那种根据格式解析DateTime的函数, 需要自己写, 或者找开源的rx_library库
//char和string的转换
Char=>String: StringOfChar(char1, 1), 或者 char1+''即可
String=>Char: String使用下标即可转成Char, 比如String123[0]
//PChar和String的互换
String=>PChar
最好使用 PChar('your_string') 强转; 使用StrPCopy(Dest: PChar; const Source: string), 它有时会报内存错误.
function StrPas(const Str: PChar): string;
Converts null-terminated string to an AnsiString (long string)
====================================
how to use Win32 system functions
====================================
function GetTempPath1: string;
var
TempDir: array[0..255] of Char;
//DWORD GetTempPath(DWORD nBufferLength, LPTSTR lpBuffer);
begin
GetTempPath(255, @TempDir);
Result := StrPas(TempDir);
end;
====================================
refresh FORM appearance in a busy loop
====================================
procedure TMainForm.Btn_Stress_Test_LoopClick(Sender: TObject);
var
I: Integer;
begin
for I := 0 to StrToInt(edt_total_count.Text) do
begin
edt_current_index.Text:=IntToStr(I);
self.stressTest();
Application.ProcessMessages();
end;
end;
====================================
解决DCOM中间层报错问题, 报错信息是: Name not unique in this context
====================================
这是一个基于DCOM技术开发的老程序, 包含中间层和客户端, 中间层使用MultiInstance 进程 + Apartment 线程模型, 有一个Remote data module通过BDE技术连接Oracle.
当多个客户端同时连中间层时, 经常能碰到报错: Name not unique in this context.
原因分析: MultiInstance 进程模式的中间层, 也就是一个进程服务所有的RPC调用. 当有多个RPC进来的时候, 启用多线程方式进行服务. 所以需要中间层有一个session管理机制. 默认情况下, BDE中间层仅仅有一个default session, 一旦多个客户端同时连着并作查询, 程序会在同一个session中, 创建数据结果集或其他对象, 就会报"Name not unique in this context."错误.
解决方法是:
首先:Remote data model上, 加 Session1(TSession 组件), 设置AutoSessionName=True, 假设 SessionName为Session1_2 .
接着:确保DBE TDatabase 组件SessionName为Session1的SessionName, 即Session1_2
最后:为Session1 设置PrivateDir. 确保每个连上中间层的session都有一个唯一的PrivateDir, 否则还会报 Directory is busy 错误. 我的做法是在Session1Startup事件中, 为session1动态指定一个临时目录.
测试的策略:
要模拟多个客户端'同时'连接中间层, 需要有点策略. 我的做法是: 随便找一个查询, 循环100次封装成一个方法. 然后启动3份客户端程序, 同时运行这个新的循环程序. 因为有100次循环, 所以必然会有多个客户端同时连接中间层.
增加 TSession 组件,
object Session1: TSession
AutoSessionName = True
KeepConnections = False
PrivateDir = ' '
OnStartup = Session1Startup
SessionName= 'Session1_2'
Left = 32
Top = 104
end
确保DBE TDatabase 组件SessionName为Session1的SessionName, 不是Session1的组件名字.
object your_db: TDatabase
AliasName = 'your_db'
DatabaseName = 'your_db'
KeepConnection = False
LoginPrompt = False
Params.Strings = (
'user name=user1'
'password=pwd')
SessionName = 'Session1_2'
Left = 24
Top = 48
end
procedure TApp.Session1Startup(Sender: TObject);
var
TempDir: array[0..255] of Char;
tempPath:String ;
fullPrivatePath:String;
begin
// set private dir for this new session
GetTempPath(255, @TempDir);
tempPath:= StrPas(TempDir);
fullPrivatePath:=tempPath+guid_str(); //使用guid来保证目录的唯一性
CreateDirectory(PChar(fullPrivatePath),nil);
Session1.PrivateDir:= fullPrivatePath;
end;
Some Delphi tips的更多相关文章
- Delphi Tips
Delphi Tips 函数篇 语法篇 函数篇 StrToDate() function StrToDate(const S: string): TDateTime; function StrToDa ...
- 获取MessageBox按钮本地字符串(OK、Cancel、Yes、No等)
问题仍然由定制MessageBox引发. 定制MessageBox,虽加入自定义些东西,但仍然希望,最大限度接近系统原生框.碰到的问题,就是其钮文本. 即如MessageBox.Show()之Mess ...
- Delphi经验总结(1)
先人的DELPHI基础开发技巧 ◇[DELPHI]网络邻居复制文件 uses shellapi; copyfile(pchar('newfile.txt'),pchar('//computername ...
- delphi 中的浮点数 (转载)
原文地址 Floating point numbers — Sand or dirt Floating point numbers are like piles of sand; every time ...
- Windows XP Manifest in Delphi
Find out how you can include the manifest into a Delphi project to allow your application to share t ...
- [VB.NET Tips]为VB.NET正名
前言 我于2005年毕业,正值全国上上下下如火如荼的开展企业信息化的时代,正是大规模软件开发的年代. 那时.NET 已经发布了2.0,但是仍是VB6,Delphi,PowerBuilder的天下,是E ...
- Mac上MySQL忘记root密码且没有权限的处理办法&workbench的一些tips (转)
忘记Root密码肿么办 Mac上安装MySQL就不多说了,去mysql的官网上下载最新的mysql包以及workbench,先安装哪个影响都不大.如果你是第一次安装,在mysql安装完成之后,会弹出来 ...
- 学习笔记:7z在delphi的应用
最近做个发邮件的功能,需要将日志文件通过邮件发送回来用于分析,但是日志文件可能会超级大,测算下来一天可能会有800M的大小.所以压缩是不可避免了,delphi中的默认压缩算法整了半天不太好使,就看了看 ...
- 【Tips】史上最全H1B问题合辑——保持H1B身份终级篇
[Tips]史上最全H1B问题合辑——保持H1B身份终级篇 2015-04-10留学小助手留学小助手 留学小助手 微信号 liuxue_xiaozhushou 功能介绍 提供最真实全面的留学干货,帮您 ...
随机推荐
- 【poj1186】 方程的解数
http://poj.org/problem?id=1186 (题目链接) 题意 已知一个n元高次方程: 其中:x1, x2,…,xn是未知数,k1,k2,…,kn是系数,p1,p2,…pn是指数 ...
- Jquery实现滚动到底部加载更多(最原始)
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...
- IIS如何设置可以让.aspx后缀的文件直接下载
修改配置文件:<system.webServer> <staticContent> <remove fileExtension=".aspx" /&g ...
- .net中ckeditor的应用
①js文件的引入 <script src="/public/ckeditor_4.4.7/ckeditor.js"></script> <script ...
- p:commandButton vs h:commandButton
同样的语句,换成primefaces就不刷新页面了.原来p的支持ajax.需要显示指定刷新全部页面.郁闷了一天了. <p:commandButton id="SearchTop&quo ...
- Linux 中 17 个 tar 命令实用示例
Tar(Tape ARchive,磁带归档的缩写,LCTT 译注:最初设计用于将文件打包到磁带上,现在我们大都使用它来实现备份某个分区或者某些重要的目录)是类 Unix 系统中使用最广泛的命令,用于归 ...
- .net 运用YUI相关的dll压缩js (按照自己的规则,想想都觉得强大和有趣)
写在前面 不管是做前端的还是做后台的,不管是懂javaScript的还是不太懂JavaScript的人,我想都或多或想的知道些许js压缩对于页面性能提升的效应吧. 之前老喜欢用在线压缩工具去压缩js, ...
- elk系列2之multiline模块的使用
preface 上回说道了elk的安装以及kibana的简单搜索语法,还有logstash的input,output的语法,但是我们在使用中发现了一个问题,我们知道,elk是每一行为一个事件,像Jav ...
- VRRP协议详解
今天做了lvs的负载均衡的实验,竟然成功了,出乎我意料......哈哈哈哈 http://blog.csdn.net/fanlu319/article/details/7013258
- 利用WSCF进行契约先行的Web Services开发
http://www.cnblogs.com/goody9807/archive/2007/06/05/772107.html 什么是契约先行(Contract-First)? 如果说一个新的软件开发 ...