在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
isDbase:=pos('.dbf',tempTableName)>0; end else begin isParadox:=TableType=ttParadox; isDbase:=TableType=ttDbase; end; if isparadox or isDbase then begin bExclusive:=Exclusive; bActive:=Active; DisableControls; // Close; Exculsive:=true; end else begin StatusMsg:='无效的数据表类型。'; Exit; end; if isParadox then begin if wwMemAvail(Sizeof(CRTblDesc)) then begin StatusMsg:='内存不足,压缩表失败。'; end else begin GetMem(pTblDesc,Sizeof(CRTblDesc)); fillchar(pTblDesc^,Sizeof(CRTblDesc),0); with pTblDesc^ do begin strCopy(szTblName,Tablename); strCopy(szTblType,szParadox); Active:=True; Check(DbiGetCursorProps(handle,Props));//检测是否右口令保护 bProtected:=props.bProtected; Active:=False; bPack:=True; end; Screen.Cursor:=crHourGlass; SetDBFlag(dbfOpened,True); rslt:=DBIdoRestructure(DBHandle,1,pTblDesc,nil,nil,nil,False); if rslt<>DBIERR_NONE then begin DBiGetErrorString(rslt,SzErrMsg); StatusMsg:=SzErrMsg; end else Result:=True; SetDBFlag(dbfOpened,False); FreeMem(pTblDesc,Sizeof(CRTlDesc)); Screen.Cursor:=crDefault; end; end else if isDbase then begin Screen.Cursor:=crHourGlass; OPen; rslt:=dbiPacktable(DBHandle,Handle,nil,nil,True); Screen.Cursor:=crDefault; if rslt<>DBIERR_NONE then begin DBiGetERRorString(rslt,szErrMsg); StatusMSg:=SzErrMsg; end else Result:=True; end; Close; Exculsive:=bExclusive; Active:=bActive; EnableControls; end;} {procedure CompactDb(DbName, NewDbName: string); var dao: OLEVariant; begin dao := CreateOleObject('DAO.DBEngine.35'); dao.CompactDatabase(DbName, NewDbName); end;} //修复Access表 procedure RepairDb(DbName: string); var Dao: OLEVariant; begin Dao := CreateOleObject('DAO.DBEngine.35'); Dao.RepairDatabase(DbName); end; //通过注册表创建ODBC配置[创建在系统DSN页下] function CreateODBCCfgInRegistry(ODBCSourceName:WideString; ServerName, DataBaseDescription:String):boolean; var Reg: TRegistry; LPT_systemDir:array [1..255] of char; P:Pchar; DriverString:String; begin Reg := TRegistry.Create; Reg.RootKey := HKEY_LOCAL_MACHINE; try try if not Reg.KeyExists('\Software\ODBC\ODBC.INI\'+trim(ODBCSourceName)) then begin //创建并打开主键。 if Reg.OpenKey('\Software\ODBC\ODBC.INI\'+trim(ODBCSourceName),True) then begin //写入键值 Reg.WriteString('DataBase', ODBCSourceName); Reg.WriteString('Description',Trim(DataBaseDescription)); GetSystemDirectory(@LPT_systemDir,255) ; P:=@LPT_systemDir; DriverString:=StrCat(P,Pchar('\SQLSRV32.DLL')) ; Reg.WriteString('Driver', DriverString); Reg.WriteString('LastUser', 'Administrator'); Reg.WriteString('Server', trim(ServerName)); Reg.WriteString('Trusted_Connection', 'Yes'); reg.CloseKey; end; //加入ODBCDataSource if Reg.OpenKey('\Software\ODBC\ODBC.INI\ODBC Data Sources\',True) then begin Reg.DeleteValue(ODBCSourceName); Reg.WriteString(ODBCSourceName, 'SQL Server'); Reg.CloseKey; end; end; Result:=True; except Result:=False; end; finally Reg.Free; end; end; function ADOConnectSysBase(Const Adocon:TadoConnection):boolean; {* 用Ado连接SysBase数据库函数} begin with Adocon do begin Close; LoginPrompt:=False; //若数据库不存在时,进行判断。。。。。。 ConnectionString:='Provider=MSDASQL.1;'+ 'Password="";'+ 'Persist Security Info=True;'+ 'Data Source=Sy_Finalact'; try KeepConnection:=True; Screen.Cursor:=crHourGlass; Connected:=True; Open; Screen.Cursor:=crDefault; ADOConnectSysBase:=True; except ADOConnectSysBase:=False; end; end; end; //Ado连接数据库函数 function ADOConnectLocalDB(Const Adocon:TAdoConnection;Const Dbname,DBServerName:String;ValidateMode:Integer):boolean; begin with Adocon do begin Close; LoginPrompt:=False; //若数据库不存在时,进行判断。。。。。。 if ValidateMode=0 then//使用Windows NT验证模式 ConnectionString:='Provider=SQLOLEDB.1;'+ 'Password="";'+ 'Integrated Security=SSPI;'+ //集成安全 'Persist Security Info=False;'+ 'User ID=sa;Initial Catalog='+''''+dbname+''''+';'+ 'Data Source='+''''+DBServerName+''''; if ValidateMode=1 then//使用SQL SERVER验证模式 ConnectionString:='Provider=SQLOLEDB.1;'+ 'Password="";'+ 'Persist Security Info=True;'+ 'User ID=sa;Initial Catalog='+''''+Dbname+''''+';'+ 'Data Source='+''''+DBServerName+''''; try KeepConnection:=True; Screen.Cursor:=crHourGlass; Connected:=True; Open; Screen.Cursor:=crDefault; ADOConnectLocalDB:=True; except ADOConnectLocalDB:=False; end; end; end; //Ado与ODBC共同连接数据库函数 function ADOODBCConnectLocalDB(Const Adocon:TAdoConnection;Const Dbname:String;ValidateMode:Integer):boolean; begin with Adocon do begin Close; LoginPrompt:=False; //若数据库不存在时,进行判断。。。。。。 if ValidateMode=0 then//使用Windows NT验证模式 ConnectionString:='Provider=MSDASQL.1;'+ 'Password="";'+ 'Persist Security Info=False;'+ 'User ID=sa;Data Source='+''''+DBName+''''+';'+ 'Initial Catalog='+''''+DBname+''''; if ValidateMode=1 then//使用SQL SERVER验证模式 ConnectionString:='Provider=MSDASQL.1;'+ 'Password="";'+ 'Persist Security Info=True;'+ 'User ID=sa;Data Source='+''''+DBName+''''+';'+ 'Initial Catalog='+''''+DBname+''''; try KeepConnection:=True; Screen.Cursor:=crHourGlass; Connected:=True; Open; Screen.Cursor:=crDefault; ADOODBCConnectLocalDB:=True; except ADOODBCConnectLocalDB:=False; end; end; end; ///在指定的数据库中建立表 function CreatTable(LpDataBaseName,LpTableName,LpSentence:string):Boolean;//建立新表 Var CreatTableQuery:TQuery; SQLsentence:string; Successed:Boolean;//成功否 begin Successed:=False; SQLsentence:='CREATE TABLE "'+ LpTableName +'" ' + LpSentence; CreatTableQuery:=TQuery.Create(nil); try try with CreatTableQuery do begin UniDirectional:=True; Active:=False; Sql.Clear; DataBaseName := LpDataBaseName; //数据库名 Sql.Add(SQLsentence); ExecSQL; Successed:=True; end; except MessageBox(Application.Handle,Pchar(' 在建立数据库 '+Trim(LpDataBaseName)+' 中的 '+Trim(LpTableName)+' 表出错,建立未能成功 !'),'建立失败',0+16); Successed:=False; end; finally CreatTableQuery.Free;//释放建立的Query if Successed then Result:=True//建立成功 else Result:=False;//建立失败 end; end; //在指定的表中新填字段 function AddField(LpFieldName:string; LpDataType: TFieldType; LpSize: Word):string;//建立新表 var Sentence,SQLsentence : string; begin Sentence:= ''; SQLsentence:=''; if LpFieldName = '' then raise EDBUpdateErr.Create('字段名不能为空'); if Pos(' ', LpFieldName) <> 0 then raise EDBUpdateErr.Create('字段名中不能含有空格字符'); if LpDataType = ftString then sentence := 'ADD '+LpFieldName+' Char('+ IntToStr( LpSize ) + ')'; if LpDataType = ftInteger then sentence := 'ADD '+LpFieldName+' Integer'; if LpDataType = ftSmallInt then sentence := 'ADD '+LpFieldName+' SmallInt'; if LpDataType = ftFloat then sentence := 'ADD '+LpFieldName+' Float('+ IntToStr( LpSize ) +',0)'; if LpDataType = ftDate then sentence := 'ADD '+LpFieldName+' Date'; if LpDataType = ftTime then sentence := 'ADD '+LpFieldName+' Time'; if LpDataType = ftDateTime then sentence := 'ADD '+LpFieldName+' TimeStamp'; if sentence = '' then raise EDBUpdateErr.Create('无效的字段类型'); if SQLSentence = '' then SQLSentence := sentence else SQLSentence := SQLSentence + ', ' + sentence; Result:=SQLSentence;//返回SQL句体 end; //在指定的表中删除字段 function KillField(LpFieldName:string):String;//删除表中的字段 var SQLsentence : string; begin if LpFieldName = '' then raise EDBUpdateErr.Create('字段名不能为空'); if Pos(' ', LpFieldName) <> 0 then raise EDBUpdateErr.Create('字段名中不能含有空格字符'); if SQLSentence = '' then SQLSentence := 'DROP COLUMN ' + LpFieldName else SQLSentence := SQLSentence + ', DROP ' + LpFieldName; Result:=SQLSentence; end; //修改表结构的SQL语句执行体 function AlterTableExec(LpDataBaseName,LpSentence:string):Boolean;//修改表结构 var AlterQueryTable:TQuery; Successed:Boolean;//成功否 begin Successed:=False; AlterQueryTable:= TQuery.Create(nil); try try with AlterQueryTable do begin DataBaseName:=LpDataBaseName;//数据库名 UniDirectional:=True; Active:=False; Sql.Clear; Sql.Add(LpSentence); ExecSQL; Successed:=True; end; except Successed:=False; end; finally AlterQueryTable.Free; if successed then Result:=True else Result:=False; end; end; //修改、添加、删除表结构时的SQL句体 function GetSQLSentence(LpTableName,LpSQLsentence:string): string; begin Result := 'ALTER TABLE "'+ LpTableName +'" ' + LpSQLSentence + ';'; end; //▎============================================================▎// //▎======================⑾进制函数及过程======================▎// //▎============================================================▎// //字符转化成十六进制 function StrToHex(AStr: string): string; var I : Integer; // Tmp: string; begin Result := ''; For I := 1 to Length(AStr) do begin Result := Result + Format('%2x', [Byte(AStr[I])]); end; I := Pos(' ', Result); While I <> 0 do begin Result[I] := '0'; I := Pos(' ', Result); end; end; //十六进制转化成字符 function HexToStr(AStr: string): string; var I : Integer; CharValue: Word; begin Result := ''; for I := 1 to Trunc(Length(Astr)/2) do begin Result := Result + ' '; CharValue := TransChar(AStr[2*I-1])*16 + TransChar(AStr[2*I]); Result[I] := Char(CharValue); end; end; function TransChar(AChar: Char): Integer; begin if AChar in ['0'..'9'] then Result := Ord(AChar) - Ord('0') else Result := 10 + Ord(AChar) - Ord('A'); end; //▎============================================================▎// //▎=====================⑿其它函数及过程=======================▎// //▎============================================================▎// // 输出限制在Min..Max之间 function TrimInt(Value, Min, Max: Integer): Integer; overload; begin if Value > Max then Result := Max else if Value < Min then Result := Min else Result := Value; end; // 输出限制在0..255之间 function IntToByte(Value: Integer): Byte; overload; asm OR EAX, EAX JNS @@Positive XOR EAX, EAX RET @@Positive: CMP EAX, 255 JBE @@OK MOV EAX, 255 @@OK: end; // 由TRect分离出坐标、宽高 procedure DeRect(Rect: TRect; var x, y, Width, Height: Integer); begin x := Rect.Left; y := Rect.Top; Width := Rect.Right - Rect.Left; Height := Rect.Bottom - Rect.Top; end; // 比较两个Rect function RectEqu(Rect1, Rect2: TRect): Boolean; begin Result := (Rect1.Left = Rect2.Left) and (Rect1.Top = Rect2.Top) and (Rect1.Right = Rect2.Right) and (Rect1.Bottom = Rect2.Bottom); end; // 产生TSize类型 function EnSize(cx, cy: Integer): TSize; begin Result.cx := cx; Result.cy := cy; end; // 计算Rect的宽度 function RectWidth(Rect: TRect): Integer; begin Result := Rect.Right - Rect.Left; end; // 计算Rect的高度 function RectHeight(Rect: TRect): Integer; begin Result := Rect.Bottom - Rect.Top; end; // 判断范围 function InBound(Value: Integer; Min, Max: Integer): Boolean; begin Result := (Value >= Min) and (Value <= Max); end; // 交换两个数 procedure CnSwap(var A, B: Byte); overload; var Tmp: Byte; begin Tmp := A; A := B; B := Tmp; end; procedure CnSwap(var A, B: Integer); overload; var Tmp: Integer; begin Tmp := A; A := B; B := Tmp; end; procedure CnSwap(var A, B: Single); overload; var Tmp: Single; begin Tmp := A; A := B; B := Tmp; end; procedure CnSwap(var A, B: Double); overload; var Tmp: Double; begin Tmp := A; A := B; B := Tmp; end; // 延时 procedure Delay(const uDelay: DWORD); var n: DWORD; begin n := GetTickCount; while ((GetTickCount - n) <= uDelay) do Application.ProcessMessages; end; // 在Win9X下让喇叭发声 procedure BeepEx(const Freq: WORD = 1200; const Delay: WORD = 1); const FREQ_SCALE = 93180; var Temp: WORD; begin Temp := FREQ_SCALE div Freq; asm in al,61h; or al,3; out 61h,al; mov al,$b6; out 43h,al; mov ax,temp; out 42h,al; mov al,ah; out 42h,al; end; Sleep(Delay); asm in al,; and al,$fc; out ,al; end; end; // 显示Win32 Api运行结果信息 procedure ShowLastError; var ErrNo: Integer; Buf: array[0..255] of Char; begin ErrNo := GetLastError; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, ErrNo, 0, Buf, 255, nil); if Buf = '' then StrCopy(@Buf, PChar(SUnknowError)); MessageBox(Application.Handle, PChar(string(Buf) + #10#13 + SErrorCode + IntToStr(ErrNo)), SCnInformation, MB_OK + MB_ICONINFORMATION); end; //将字体Font.Style写入INI文件 function writeFontStyle(FS: TFontStyles; inifile: string; write: boolean):string; var Mystyle : string; Myini : Tinifile; begin Mystyle := '['; if fsBold in FS then MyStyle := MyStyle + 'fsBold'; if fsItalic in FS then if MyStyle = '[' then MyStyle := MyStyle + 'fsItalic' else MyStyle := MyStyle + ',fsItalic'; if fsUnderline in FS then if MyStyle = '[' then MyStyle := MyStyle + 'fsUnderline' else MyStyle := MyStyle + ',fsUnderline'; if fsStrikeOut in FS then if MyStyle = '[' then MyStyle := MyStyle + 'fsStrikeOut' else MyStyle := MyStyle + ',fsStrikeOut'; MyStyle := MyStyle + ']'; if write then begin Myini := TInifile.Create(inifile); Myini.WriteString('FontStyle', 'style', MyStyle); Myini.free; end; Result := MyStyle; end; //从INI文件中读取字体Font.Style文件 function readFontStyle(inifile: string): TFontStyles; var MyFontStyle : TFontStyles; MyStyle : string; Myini : Tinifile; begin MyFontStyle := []; Myini := TInifile.Create(inifile); Mystyle := Myini.ReadString('Fontstyle', 'style', '[]'); if pos('fsBold', Mystyle) > 0 then MyFontStyle := MyFontStyle + [fsBold]; if Pos('fsItalic', MyStyle) > 0 then MyFontStyle := MyFontStyle + [fsItalic]; if Pos('fsUnderline', MyStyle) > 0 then MyFontStyle := MyFontStyle + [fsUnderline]; if Pos('fsStrikeOut', MyStyle) > 0 then MyFontStyle := MyFontStyle + [fsStrikeOut]; MyIni.free; Result := MyFontStyle; end; //*取得TMemo 控件当前光标的行和列信息到Tpoint中 //function ReadCursorPos(SourceMemo: TMemo): TPoint; function ReadCursorPos(SourceMemo: TMemo): string; var // Point: TPoint; X,Y:integer; begin // point.y := SendMessage(SourceMemo.Handle, EM_LINEFROMCHAR,SourceMemo.SelStart,0); // point.x := SourceMemo.SelStart- SendMessage(SourceMemo.Handle,EM_LINEINDEX,point.y,0); y := SendMessage(SourceMemo.Handle, EM_LINEFROMCHAR,SourceMemo.SelStart,0); x := SourceMemo.SelStart- SendMessage(SourceMemo.Handle,EM_LINEINDEX,y,0); Result := '行:'+inttostr(y+1)+' '+'列:'+inttostr(x+1); end; //*检查Tmemo控件能否Undo功能 function CanUndo(AMemo: TMemo): Boolean; begin Result :=AMemo.Perform(EM_CANUNDO, 0, 0)<>0; end; //* 实现Undo功能 procedure Undo(Amemo: Tmemo); begin Amemo.Perform(EM_UNDO, 0, 0); end; //* 实现ComBoBox自动下拉 procedure AutoListDisplay(ACombox:TComboBox); begin SendMessage(ACombox.handle, CB_SHOWDROPDOWN, Integer(True), 0); end; //* 小写金额转换为大写 function UpperMoney(small:real):string; var SmallMonth,BigMonth:string; wei1,qianwei1:string[2]; qianwei,dianweizhi,qian:integer; ObjSmall:real; begin {------- 修改参数令值更精确 -------} ObjSmall:=Abs(small); qianwei:=-2; Smallmonth:=formatfloat('0.00',ObjSmall); dianweizhi :=pos('.',Smallmonth); for qian:=length(Smallmonth) downto 1 do begin if qian<>dianweizhi then begin case strtoint(copy(Smallmonth,qian,1)) of 1:wei1:='壹'; 2:wei1:='贰'; 3:wei1:='叁'; 4:wei1:='肆'; 5:wei1:='伍'; 6:wei1:='陆'; 7:wei1:='柒'; 8:wei1:='捌'; 9:wei1:='玖'; 0:wei1:='零'; end; case qianwei of -3:qianwei1:='厘'; -2:qianwei1:='分'; -1:qianwei1:='角'; 0 :qianwei1:='元'; 1 :qianwei1:='拾'; 2 :qianwei1:='佰'; 3 :qianwei1:='千'; 4 :qianwei1:='万'; 5 :qianwei1:='拾'; 6 :qianwei1:='佰'; 7 :qianwei1:='千'; 8 :qianwei1:='亿'; 9 :qianwei1:='十'; 10:qianwei1:='佰'; 11:qianwei1:='千'; end; inc(qianwei); if Small<0 then BigMonth :='负'+wei1+qianwei1+BigMonth else BigMonth :=wei1+qianwei1+BigMonth end; end; Result:=BigMonth; end; //利用系统时间产生随机数 function Myrandom(Num: Integer): integer; var T: _SystemTime; X: integer; I: integer; begin Result := 0; If Num = 0 then Exit;; GetSystemTime(T); X := Trunc(T.wMilliseconds/10) * T.wSecond * 1231; X := X + random(1); if X<>0 then X := -X; X := Random(X); X := X mod num; for I := 0 to X do X := Random(Num); Result := X; end; //打开输入法 procedure OpenIME(ImeName: string); var i: integer; MyHKL: hkl; begin if ImeName <> '' then begin if Screen.Imes.Count <> 0 then begin i := Screen.Imes.IndexOf(ImeName); if i >= 0 then MyHKL := hkl(Screen.Imes.Objects[i]); ActivateKeyboardLayout(MyHKL, KLF_ACTIVATE); end; end; end; //关闭输入法 procedure CloseIME; var MyHKL: hkl; begin MyHKL := GetKeyboardLayout(0); if ImmIsIme(MyHKL) then ImmSimulateHotKey(Application.Handle, IME_CHOTKEY_IME_NONIME_TOGGLE); end; //打开中文输入法 procedure ToChinese(hWindows: THandle; bChinese: boolean); begin if ImmIsIME(GetKeyboardLayOut(0)) <> bChinese then ImmSimulateHotKey(hWindows, IME_THotKey_IME_NonIME_Toggle); end; //数据备份 procedure BackUpData(LpBackDispMessTitle:String); var i,j:integer; Source,Dest:array[0..200]of char; s1:string; Lp:_SHFILEOPSTRUCTA; Success:Integer; begin if MessageBox(Application.Handle,' 您确认要备份数据吗?','询问窗口',4+32+256)=6 then begin with LP do begin Lp.wnd:=Application.Handle; wFunc:=FO_COPY; s1:='DATA\*.*'; i:=Length(s1); StrCopy(Source,PChar(s1)); Source[i]:=#0; Source[i+1]:=#0; Source[i+2]:=#0; pFrom:=Source; s1:='BACKUP'; j:=Length(s1); StrCopy(Dest,PChar(s1)); Dest[j]:='\'; Dest[j+1]:=#0; Dest[j+2]:=#0; Dest[j+3]:=#0; pTo:=Dest; fFlags:=FOF_ALLOWUNDO; fAnyOperationsAborted:=False; lpszProgressTitle:=PChar(LpBackDispMessTitle); end; Success:=SHFileOperation(LP); case Success of 0: MessageBox(Application.Handle,' 所有数据已备份完成 !','提示窗口',0+48); 117: MessageBox(Application.Handle,Pchar(' 您未创建“'+ExtractFilePath(Application.ExeName)+'BACKUP”目录所以不能完成数据备份 !'),'提示窗口',0+16) else MessageBox(Application.Handle,' 在备份数据的过程中被用户中途中断 !','提示窗口',0+16); end; end; end; //////////////////////////////////////////////////////////////////////////////// // // // 从文件中读取Ado连接字串 // // // //////////////////////////////////////////////////////////////////////////////// function GetConnectionString(DataBaseName:string):string; var FileStringList:Tstringlist; TempString: ansistring; TheReg:TRegistry;KeyName,fAppPath:string; i:Integer; begin TheReg:=TRegistry.Create; try TheReg.RootKey:=HKEY_LOCAL_MACHINE; KeyName:='Software\政府采购管理系统'; if TheReg.OpenKey(KeyName,False) then fAppPath:=TheReg.ReadString('ApplicationPath'); finally TheReg.Free; end; FileStringList:=Tstringlist.Create; //先判断connection.txt是否存在,存在就调入 if FileExists(fAppPath+'\connection.txt') then FileStringList.LoadFromFile(fAppPath+'\connection.txt') else begin application.MessageBox('在系统所在目录中没有检测到连接文件(connection.txt),无法启动系统。','提示',MB_IconError+mb_ok); Result:=''; FileStringList.Free; Exit; end; //组成一个符串,好进行处理。 TempString:=''; for i:=0 to FileStringList.Count-1 do begin TempString:=TempString+FileStringList.strings[i]; end; TempString:=Replace(TempString,'DataBaseName',DataBaseName,False); Result:=TempString; end; {function GetRemoteServerName:返回远程服务器的机器名称} function GetRemoteServerName:string; var iniServer:TIniFile; TheReg:TRegistry;KeyName,fAppPath,RServerName:string; begin TheReg:=TRegistry.Create; try TheReg.RootKey:=HKEY_LOCAL_MACHINE; KeyName:='Software\政府采购管理系统'; if TheReg.OpenKey(KeyName,False) then fAppPath:=TheReg.ReadString('ApplicationPath'); finally TheReg.Free; end; try iniServer:=TIniFile.Create(fAppPath+'\RemoteServerName.ini'); with iniServer do RServerName:=ReadString('Option','RServerName',''); iniServer.Free; except raise exception.Create('致命错误:未找到包含Com服务器配置的信息文件,初始化失败。'); end; Result:=RServerName; end; initialization WndLong := GetWindowLong(Application.Handle, GWL_EXSTYLE); end. {▎ 觉得还一般 请关注 http://www.cdsunco.com/down.htm 还有更多的好东西 ▎} |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论