?? udbm.pas
字號:
DriverId=25;
Exclusive=1;
FIL=MS Access;
MaxBufferSize=2048;
MaxScanRows=8;
PageTimeout=5;
ReadOnly=0;
SafeTransactions=0;
Threads=3;
UID=admin;
UserCommitSync=Yes;"
//}
//adocLink.ConnectionString := 'Provider=MSDASQL.1;Password=why;'+
// 'Persist Security Info=True;User ID=admin;Extended Properties="'+
// 'DBQ='+vdir+'cardBase.mdb;'+
// 'Driver={Microsoft Access Driver (*.mdb)};'+
// 'DriverId=25;Exclusive=1;FIL=MS Access;MaxBufferSize=2048;MaxScanRows=8;'+
// 'PageTimeout=5;ReadOnly=0;SafeTransactions=0;Threads=3;UID=admin;"';
//}
// mdbUser := 'admin';
// mdbPass := '';
adocLink.ConnectionString := 'Provider=MSDASQL.1;Password='+mdbPass+';'+
'Persist Security Info=True;User ID='+mdbUser+';Extended Properties="'+
'DBQ='+sPathName+';'+
'Driver={Microsoft Access Driver (*.mdb)};'+
'DriverId=25;Exclusive=1;FIL=MS Access;MaxBufferSize=2048;MaxScanRows=8;'+
'PageTimeout=5;ReadOnly=0;SafeTransactions=0;Threads=3;UID='+mdbUser+';"';
try
adocLink.Connected := true;
except
exit;
end;
Result := adocLink.Connected;
{
slt := TStringList.Create();
adocLink.GetTableNames(slt,false);//B
for i := 0 to slt.Count-1 do
begin
ss := slt.Strings[i];
//ss := copy(ss,5,length(ss)-4);
cbxTable.Items.Add( ss );
end;
slt.Free;
//}
end;
procedure Tdbm.DataModuleCreate(Sender: TObject);
begin
appPath := ExtractFileDir(Application.ExeName);
sys32Path := GetSysPath();
end;
procedure Tdbm.listODBCs( sl : TStrings );
var
TheReg : TRegistry;
// Names : TStringList;
begin
inherited;
// Session.GetAliasNames(Memo1.Lines) ;
TheReg := TRegistry.Create;
TheReg.RootKey := HKEY_LOCAL_MACHINE;
try
if TheReg.OpenKey( '\software\odbc\odbc.ini\ODBC Data Sources',false ) then
begin
TheReg.GetValueNames( sl );
end;
finally
TheReg.Free;
end;
end;
function getFieldTypeSQL( sDPName : string ) : string;
begin
sDPName := Trim(sDPName);
Result := '';
if sDPName='TIntegerField' then
begin
Result := 'int';
end
else if sDPName='TStringField' then
begin
Result := 'varchar';
end
else if sDPName='TWideStringField' then
begin
Result := 'varchar';
end
else if sDPName='TFloatField' then
begin
Result := 'float';
end
else if sDPName='TCurrencyField' then
begin
Result := 'money';
end
else if sDPName='TBCDField' then
begin
Result := 'money';
end
else if sDPName='TDateTimeField' then
begin
Result := 'datetime';
end
else if sDPName='TBooleanField' then
begin
Result := 'bit';
end
else if sDPName='TBlobField' then
begin
Result := 'image';
end
else if sDPName='TAutoIncField' then
begin
Result := 'int (自增)';
end
else if sDPName='TSmallintField' then
begin
Result := 'smallint';
end
else if sDPName='TMemoField' then
begin
Result := 'text';
end
else
begin
//TWordField
//TBytesField
// Result := '-【'+sDPName+'】-';
Result := '--';
end;
end;
function getFieldTypeMySQL( sDPName : string ) : string;
begin
sDPName := Trim(sDPName);
Result := '';
if sDPName='TIntegerField' then
begin
Result := 'int';
end
else if sDPName='TStringField' then
begin
Result := 'varchar';
end
else if sDPName='TWideStringField' then
begin
Result := 'varchar';
end
else if sDPName='TFloatField' then
begin
Result := 'float';
end
else if sDPName='TCurrencyField' then
begin
Result := 'money';
end
else if sDPName='TBCDField' then
begin
Result := 'money';
end
else if sDPName='TDateTimeField' then
begin
Result := 'datetime';
end
else if sDPName='TBooleanField' then
begin
Result := 'bit';
end
else if sDPName='TBlobField' then
begin
Result := 'image';
end
else if sDPName='TAutoIncField' then
begin
Result := 'int (自增)';
end
else if sDPName='TSmallintField' then
begin
Result := 'smallint';
end
else if sDPName='TMemoField' then
begin
Result := 'text';
end
else
begin
//TWordField
//TBytesField
// Result := '-【'+sDPName+'】-';
Result := '--';
end;
end;
function getFieldTypeAccess( sDPName : string ) : string;
begin
sDPName := Trim(sDPName);
{
文本 | varchar【50】 | TWideStringField
備注 | text【0】 | TMemoField
數字 | int【0】 | TIntegerField
日期/時間 | datetime【0】 | TDateTimeField
貨幣 | money【4】 | TBCDField
自動編號 | int(自增)【0】 | TAutoIncField
是/否 | bit【0】 | TBooleanField
OLE 對象 | image【0】 | TBlobField
超級鏈接 | text【0】 | TMemoField
數字(查閱向導)| int【0】 | TIntegerField
}
Result := '';
if sDPName='TIntegerField' then
begin
Result := 'int';
end
else if sDPName='TStringField' then
begin
Result := 'varchar';
end
else if sDPName='TWideStringField' then
begin
Result := 'varchar';
end
else if sDPName='TFloatField' then
begin
Result := 'float';
end
else if sDPName='TBCDField' then
begin
Result := 'money';
end
else if sDPName='TCurrencyField' then
begin
Result := 'money';
end
else if sDPName='TDateTimeField' then
begin
Result := 'datetime';
end
else if sDPName='TBooleanField' then
begin
Result := 'bit';
end
else if sDPName='TBlobField' then
begin
Result := 'image';
end
else if sDPName='TAutoIncField' then
begin
Result := 'int(自增)';
end
else if sDPName='TSmallintField' then
begin
Result := 'smallint';
end
else if sDPName='TMemoField' then
begin
Result := 'text';
end
else
begin
Result := '--';
end;
end;
function getFieldTypeDB2( sDPName : string ) : string;
begin
sDPName := Trim(sDPName);
Result := '';
if sDPName='TIntegerField' then
begin
Result := 'int';
end
else if sDPName='TStringField' then
begin
Result := 'varchar';
end
else if sDPName='TWideStringField' then//TStringField
begin
Result := 'varchar';
end
else if sDPName='TFloatField' then
begin
Result := 'float';
end
else if sDPName='TCurrencyField' then
begin
Result := 'money';
end
else if sDPName='TDateField' then
begin
Result := 'datetime';
end
else if sDPName='TDateTimeField' then
begin
Result := 'datetime';
end
else if sDPName='TBooleanField' then
begin
Result := 'bit';
end
else if sDPName='TBlobField' then
begin
Result := 'image';
end
else if sDPName='TAutoIncField' then
begin
Result := 'int (自增)';
end
else if sDPName='TSmallintField' then
begin
Result := 'smallint';
end
else if sDPName='TMemoField' then
begin
Result := 'text';
end
else//'TDateField'
begin
Result := '-【'+sDPName+'】-';
end;
end;
function FullString(Const Source,Seep:String; Const Number:Integer; Const bLeftAdd:Boolean=True ): String;
var
TempStr:String;
i:integer;
begin
TempStr:=Source;
For i:=length(Source) to Number-1 do
begin
if bLeftAdd then//左補
TempStr := Seep+TempStr
else//右補
TempStr := TempStr+Seep;
end;
Result := TempStr;
end;
//fri變量,只能包含有 小數點、空格、 '/'、數字。如 1 1/2 或1.2
function fri2decimal(fri: string): double;
var
strs: TStrings;
fri_dec: double;
function csubstr(substr: string; str: string): integer;
var
i, j: integer;
begin
j := 0;
for i := 1 to length(str) do
if str[i] = substr then j := j + 1;
result := j;
end;
function onlydecimal(str_fri: string): double;
begin
//2.只有小數點、沒有空格、'/' 如有只一個小數點,則直接轉換,如有多個小數點,全部去掉后轉換
if csubstr('.', str_fri) <> 1 then //一個小數點的保留
str_fri := StringReplace(str_fri, '.', '', [rfReplaceAll]); //多個小數點全去掉
result := strtofloat(str_fri);
end;
function onlyspace(str_fri: string): double;
begin
//3.只有空格、沒有小數點、'/' 去除全部空格后轉換
str_fri := StringReplace(str_fri, ' ', '', [rfReplaceAll]);
result := strtofloat(str_fri);
end;
function onlyxg(str_fri: string): double;
begin
//4.只有'/'、沒有小數點、空格 ,如'/'在頭,在尾,或多個都全部去掉,只有一個的進行除運算,如分母為0的,僅對分子進行轉換
//如果/在頭與尾,或超過1個則去掉/
if (pos('/', str_fri) = 1) or (pos('/', str_fri) = length(str_fri)) or (csubstr('/', str_fri) <> 1) then
begin
str_fri := StringReplace(str_fri, '/', '', [rfReplaceAll]);
result := strtofloat(str_fri);
end
else
begin //如果在中間,進行除法運算
strs := TStringList.Create;
strs.Delimiter := '/';
strs.DelimitedText := str_fri;
if strtofloat(strs[1]) = 0 then //如分母為0的,僅對分子進行轉換
result := strtofloat(strs[0])
else //use Math
result := roundto(strtofloat(strs[0]) / strtofloat(strs[1]), -5);
strs.Free;
end;
end;
function spacexg(str_fri: string): double;
begin
if (pos('/', str_fri) = 1) or (pos('/', str_fri) = length(str_fri)) or (csubstr('/', str_fri) <> 1) then //如果/在最前與最后,去掉/
begin ///在最前與最后,或多個/去掉/
str_fri := StringReplace(str_fri, '/', '', [rfReplaceAll]);
result := onlyspace(str_fri);
end
else if (pos('/', str_fri) < pos(' ', str_fri)) or (csubstr(' ', str_fri) <> 1) then //如果/在空格前面,去除空格,按分數計算
begin //如果/在空格前,或多個空格 去掉空格
str_fri := StringReplace(str_fri, ' ', '', [rfReplaceAll]);
result := onlyxg(str_fri);
end
else
begin
strs := TStringList.Create;
strs.Delimiter := ' ';
strs.DelimitedText := str_fri;
result := strtofloat(strs[0]) + onlyxg(strs[1]);
end;
end;
begin
result := 0;
//1.空格、小數點、'/' 都沒有 直接轉換為小數
if (pos(' ', fri) = 0) and (pos('.', fri) = 0) and (pos('/', fri) = 0) then
result := strtofloat(fri);
//2.只有小數點、沒有空格、'/' 如有只一個小數點,則直接轉換,如有多個小數點,全部去掉后轉換
if (pos(' ', fri) = 0) and (pos('.', fri) <> 0) and (pos('/', fri) = 0) then
result := onlydecimal(fri);
//3.只有空格、沒有小數點、'/' 去除全部空格后轉換
if (pos(' ', fri) <> 0) and (pos('.', fri) = 0) and (pos('/', fri) = 0) then
result := onlyspace(fri);
//4.只有'/'、沒有小數點、空格 ,如'/'在頭,在尾,或多個都全部去掉,只有一個的進行除運算,如分母為0的,僅對分子進行轉換
if (pos(' ', fri) = 0) and (pos('.', fri) = 0) and (pos('/', fri) <> 0) then
result := onlyxg(fri);
//5.有小數點 有空格,沒有'/' 去掉空格,按小數來來計算
if (pos(' ', fri) <> 0) and (pos('.', fri) <> 0) and (pos('/', fri) = 0) then
begin
fri := StringReplace(fri, ' ', '', [rfReplaceAll]);
result := onlydecimal(fri);
end;
//6.有'/',有小數點 沒空格, 去掉小數點,按/來來計算
if (pos(' ', fri) = 0) and (pos('.', fri) <> 0) and (pos('/', fri) <> 0) then
begin
fri := StringReplace(fri, '.', '', [rfReplaceAll]);
result := onlyxg(fri);
end;
//7.有'/',有空格 沒小數點,
if (pos(' ', fri) <> 0) and (pos('.', fri) = 0) and (pos('/', fri) <> 0) then
result := spacexg(fri);
//8.有'/',有空格 有小數點, 去除小數點,按7來算
if (pos(' ', fri) <> 0) and (pos('.', fri) <> 0) and (pos('/', fri) <> 0) then
begin
fri := StringReplace(fri, '.', '', [rfReplaceAll]);
result := spacexg(fri);
end;
end;
function Fraction(decimal: double): string;
var
intNumerator, intDenominator, intNegative: integer; // 聲明整數變量為長整數
dblFraction, dblDecimal, dblAccuracy, dblinteger: Double; // 聲明浮點數為雙精度
begin
//十進制小數轉分數(無下載)
{
原作者
Written by: Erik Oosterwal
' Started on: November 9, 2005
' Completed on: November 9, 2005
增加大于1的小數的轉化
小數到分數的轉化
By Erik Oosterwal 翻譯: Zoologist
下面將介紹一種小數轉化為分數的簡單方法,這種方法能將十進制的小數轉化為分子與分
母都是整數的分數,換句話說,這個算法能夠自動判定循環節。任何十進制數值都能被轉
化為一個指定精度的分數。
這個算法的根本原理是:一個分數對應一條直線的斜率。用數學語言描述就是:一條直線
的斜率是無窮大(垂直于X軸)或者是(Y2-Y1) / (X2-X1),我們要做的就是找到2個整數,
在指定的精度范圍內接近這個斜率。對于正數來說,我們設置分子為0,分母為1,然后比
較這個分數同給定的十進制數。如果我們的分數太小了(比如,我們選擇的點在直線的下
面),我們就加大分子的值直到這個分數太大(比如,這個點在直線的上方),之后我們
在增加分母的大小直到這個點在直線下方。
如果我們的最終目標是無理數(無限不循環小數),這個算法將一直繼續,增加分子和分
母,直到最終結果在指定的精度上。
}
dblDecimal := decimal; //取得目標小數
if trunc(decimal) = decimal then // 如果是整數,則直轉
result := floattostr(decimal)
else
begin
if abs(decimal) > 1 then //如果小數大于1 如 10.24 ,進行拆解
begin
dblinteger := trunc(decimal); //取出整數部分
dblDecimal := abs(frac(decimal)); //取出小數部分
end
else dblDecimal := decimal;
dblAccuracy := 0.01; //設置精度
intNumerator := 0; //初始分子為0
intDenominator := 1; //初始分母為1
intNegative := 1; //符號標記為正
if dblDecimal < 0 then intNegative := -1; //如果目標為負,設置負標志位
dblFraction := 0; //設置分數值為 0/1
while Abs(dblFraction - dblDecimal) > dblAccuracy do //如果當前沒有達到精度要求就繼續循環
begin
if Abs(dblFraction) > Abs(dblDecimal) then //如果我們的分數大于目標
intDenominator := intDenominator + 1 //增加分母
else //否則
intNumerator := intNumerator + intNegative; //增加分子
dblFraction := intNumerator / intDenominator; //計算新的分數
end;
// edit2.Text := inttostr(intNumerator) + '/' + inttostr(intDenominator);
if abs(decimal) > 1 then //如果小數大于1 如 10.24 ,進行拆解
result := floattostr(dblinteger) + ' ' + inttostr(intNumerator) + '/' + inttostr(intDenominator)
else
result := inttostr(intNumerator) + '/' + inttostr(intDenominator);
end;
end;
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -