1、加载splash启动画面的时候屏幕出现闪动现象
原因:启动的时候同时加载了很多窗体包括数据库数据的读取
解决:窗体全部动态创建加载,只有启动画面是自动创建
varTempCanvas:TCanvas;BufDC:HDC;BufBitmap:HBITMAP;begin//创建一个与显示设备兼容的内存设备BufDC:=CreateCompatibleDC(Canvas.Handle);//创建一个与显示设备兼容的位图BufBitmap:=CreateCompatibleBitmap(Canvas.Handle,ClientWidth,ClientHeight);//将设备与位图关联SelectObject(BufDC,BufBitmap);//CreateCompatibleBitmap创建位图后数据初始化为0,而RGB(0,0,0)则表示是黑色//这里需要清除其黑色背景,使其变为透明PerformEraseBackground(Self,BufDC);//临时的Canvas,用来画图用,但它并不是必须的,可以直接使用GDI函数来画图TempCanvas:=TCanvas.Create;//关联到内存设备TempCanvas.Handle:=BufDC;//可以开始画图了,这里演示用随机颜色画边框Randomize;TempCanvas.Brush.Color:=Random($FFFFFF);TempCanvas.FrameRect(ClientRect);//一次性将内存图像数据覆盖过去,因为跳过了擦除背景过程,所以避免了闪烁的问题BitBlt(Canvas.Handle,0,0,ClientWidth,ClientHeight,TempCanvas.Handle,0,0,SRCCOPY);//释放资源DeleteDC(BufDC);DeleteObject(BufBitmap);FreeAndNil(TempCanvas);end;
ADOQuery1.DisableControls。。。。。ADOQuery1.EnableControls
2、TTS语音朗读
必须先安装语音库才能正确识别,win7的语音库已经集成只需安装语音包
3、报表FASTREPORT
需要反复编译对于高版本的自定义模板有时候乱码
4、滚动条一定要选择好父窗口
我在mainform的FormMouseWheel的事件里边写了相应鼠标滚轮的事件。然后刚进系统,鼠标滚动,滚动条也能正常滚动。procedureTMainForm.FormMouseWheel(Sender:TObject;Shift:TShiftState;WheelDelta:Integer;MousePos:TPoint;varHandled:Boolean);beginifWheelDelta<0thensbxts200001.perform(WM_VSCROLL,SB_LINEDOWN,0)elsesbxts200001.perform(WM_VSCROLL,SB_LINEUP,0)
5、防止程序重复运行
//==============================================================================//工作流程//程序运行先取代原有向所有消息处理过程,然后广播一个消息.//如果有其它实例运行,收到广播消息会回发消息给发送程序,并传回它自己的句柄//发送程序接收到此消息,激活收到消息的程序,然后关闭自己//==============================================================================unit互斥防重复;
interface
usesWindows,Messages,SysUtils,Classes,Forms;
implementation
constSTR_UNIQUE='{2BE6D96E-827F-4BF9-B33E-8740412CDE96}';MI_ACTIVEAPP=1;//激活应用程序MI_GETHANDLE=2;//取得句柄
variMessageID:Integer;OldWProc:TFNWndProc;MutHandle:THandle;BSMRecipients:DWORD;
functionNewWndProc(Handle:HWND;Msg:Integer;wParam,lParam:Longint):Longint;stdcall;beginResult:=0;ifMsg=iMessageIDthenbegincasewParamofMI_ACTIVEAPP://激活应用程序iflParam<>0thenbegin//收到消息的激活前一个实例//为什么要在另一个程序中激活//因为在同一个进程中SetForegroundWindow并不能把窗体提到最前ifIsIconic(lParam)thenOpenIcon(lParam)elseSetForegroundWindow(lParam);//终止本实例Application.Terminate;end;MI_GETHANDLE://取得程序句柄beginPostMessage(HWND(lParam),iMessageID,MI_ACTIVEAPP,Application.Handle);end;end;endelseResult:=CallWindowProc(OldWProc,Handle,Msg,wParam,lParam);end;
procedureInitInstance;begin//取代应用程序的消息处理OldWProc:=TFNWndProc(SetWindowLong(Application.Handle,GWL_WNDPROC,Longint(@NewWndProc)));
//打开互斥对象MutHandle:=OpenMutex(MUTEX_ALL_ACCESS,False,STR_UNIQUE);ifMutHandle=0thenbegin//建立互斥对象MutHandle:=CreateMutex(nil,False,STR_UNIQUE);endelsebeginApplication.ShowMainForm:=False;//已经有程序实例,广播消息取得实例句柄BSMRecipients:=BSM_APPLICATIONS;BroadCastSystemMessage(BSF_IGNORECURRENTTASKorBSF_POSTMESSAGE,@BSMRecipients,iMessageID,MI_GETHANDLE,Application.Handle);end;end;
initialization//注册消息iMessageID:=RegisterWindowMessage(STR_UNIQUE);InitInstance;
finalization//还原消息处理过程ifOldWProc<>NilthenSetWindowLong(Application.Handle,GWL_WNDPROC,LongInt(OldWProc));
//关闭互斥对象ifMutHandle<>0thenCloseHandle(MutHandle);