bestlong 怕失憶筆記

當健忘由隨機逐漸趨向常態時,作筆記是非常必要的

Entries for the ‘Delphi’ Category

[Delphi] 遇上錯誤訊息 OLE error 80030002

使用 ADO 做資料庫連接,在 MainForm 上放置兩個 TADOConnection 各自連接 MS SQL 2000 與 MS Access 2000 兩個資料庫。

原本相安無事,但隨著程式碼的累積,忽然間,連接 Access 的 TADOConnection 居然一直造成錯誤。

出現的錯誤對話框顯示著 OLE error 80030002 訊息。

在網路上找到此篇
INFO: Translating Automation Errors for VB/VBA (Long)

其中有列出

-2147287038 (80030002) %1 could not be found.

因為要開啟的檔案不存在所以找不到,所以是參數的問題。

只好重新追蹤看看,花了將近ㄧ個下午的時間終於找到原因。居然是因為使用了 FileListBox1 元件的問題。就是因為下列幾行指令的影響

procedure TfmMain.FormCreate(Sender: TObject);
(省略)
gs_AppPath := AddSlash(ExtractFilePath(Application.ExeName));
gs_DownLoadPath := AddSlash(gs_AppPath + ‘download’);
FileListBox1.Directory := gs_DownLoadPath; // 因為加了此行造成錯誤
(省略)
end;

執行 FileListBox1.Directory := gs_DownLoadPath; 後會導致程式執行時的工作目錄也改變成 gs_DownLoadPath 的內容。所以之後的程式碼若是有使用相對路徑的方式就有可能會導致路徑錯誤。

也剛好讀取 Access 的 TADOConnection 的 ConnectionString 屬性就是使用相對路徑的方式,來連接應用程式相同目錄下的 DB.UDL 資料連接設定檔。因為是在工作目錄的變動後才連線所以造成錯誤。

Leave a Comment

[Delphi] 避免浮點數型態變數運算的四捨五入錯誤

這是一個令程式設計師有些傷腦筋的問題,在網路上找到此簡體版的技術文件,作者未知,記錄起來當筆記。

資料型態 為 Single、Double 和 Extended 的浮點數變數存在著四捨五入的問題。舉個例子,假設我們用電腦使用小數四位,那麼:

   1 / 3 = 0.3333

我們都知道 3 * 1 / 3 = 1 但如果我們這樣

   X := 1 / 3;
   X := X * 3;
   if X = 1 then //比對結果將會不正確

為什麼呢?
(Read the rest of this entry…)

Comments (4)

Delphi 動態隱藏視窗的標題列(同時保留 Sizeable 特性)

當希望程式執行想要去掉上方的標題列時, 可以設置 Form.BorderStyle := bsNone;
不過同時會造成視窗無法 Sizeable (通過滑鼠調整視窗大小).
某位前人仔細翻看了相關 Help 也沒找到解決辦法, 最後在 DFW 裡終於找到答案:

1
2
3
4
5
6
7
8
9
10
procedure TForm1.FormCreate(Sender: TObject);
begin
  SetWindowLong(Handle,      // 視窗 Handle
                GWL_STYLE,   // 表示是要設定新的視窗(普通)樣式
                GetWindowLong(Handle, GWL_STYLE)  // 取得指定視窗訊息
                  and (not WS_CAPTION) // 去掉樣式 (s) 中的 "標題" 樣式
                );
  Height := ClientHeight;
  Width := ClientWidth;
end;

Leave a Comment

獲得Window系統資訊(語言/國別…)

Windows API中有一個函數GetLocaleInfo可以用來獲得系統資訊比如系統語言, 貨幣符號等
代碼如下:

function TForm1.GetLocaleInformation(Flag: Integer): String;
var pcLCA: Array[0..20] of Char;
begin
if( GetLocaleInfo(LOCALE_SYSTEM_DEFAULT,Flag,pcLCA,19) <= 0 ) then begin pcLCA[0] := #0; end; Result := pcLCA; end; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(GetLocaleInformation(LOCALE_SENGLANGUAGE)); end;   參數"Flag"可以取下列值: LOCALE_NOUSEROVERRIDE { do not use user overrides } LOCALE_USE_CP_ACP { use the system ACP } LOCALE_ILANGUAGE { 語言代號 } LOCALE_SLANGUAGE { 本地語言名稱 } LOCALE_SENGLANGUAGE { 語言的英語名 } LOCALE_SABBREVLANGNAME { 語言名稱縮寫 } LOCALE_SNATIVELANGNAME { 本地語言名稱 } LOCALE_ICOUNTRY { 國家代號 } LOCALE_SCOUNTRY { 國家名 } LOCALE_SENGCOUNTRY { 國家的英語名稱 } LOCALE_SABBREVCTRYNAME { 國家名縮寫 } LOCALE_SNATIVECTRYNAME { 國家名 } LOCALE_IDEFAULTLANGUAGE { 缺省語言代號 } LOCALE_IDEFAULTCOUNTRY { 缺省國家代碼 } LOCALE_IDEFAULTCODEPAGE { 缺省oem內碼表 } LOCALE_IDEFAULTANSICODEPAGE { 缺省ansi內碼表 } LOCALE_IDEFAULTMACCODEPAGE { 缺省mac頁 } LOCALE_SLIST { 列表項分割符 } LOCALE_IMEASURE { 測量單位0 = 米制, 1 = 英制 } LOCALE_SDECIMAL { 小數點符號 } LOCALE_STHOUSAND { 千位分割符 } LOCALE_SGROUPING { digit grouping } LOCALE_IDIGITS { number of fractional digits } LOCALE_ILZERO { leading zeros for decimal } LOCALE_INEGNUMBER { 負數模式 } LOCALE_SNATIVEDIGITS { native ascii 0-9 } LOCALE_SCURRENCY { 本地貨幣符號 } LOCALE_SINTLSYMBOL { 國際貨幣符號 } LOCALE_SMONDECIMALSEP { 貨幣小數點分割符 } LOCALE_SMONTHOUSANDSEP { 貨幣千位分割符 } LOCALE_SMONGROUPING { monetary grouping } LOCALE_ICURRDIGITS { # local monetary digits } LOCALE_IINTLCURRDIGITS { # intl monetary digits } LOCALE_ICURRENCY { positive currency mode } LOCALE_INEGCURR { negative currency mode } LOCALE_SDATE { 日期分割符 } LOCALE_STIME { 時間分割符 } LOCALE_SSHORTDATE { 短日期字串 } LOCALE_SLONGDATE { 長日期字串 } LOCALE_STIMEFORMAT { time format string } LOCALE_IDATE { short date format ordering } LOCALE_ILDATE { long date format ordering } LOCALE_ITIME { time format specifier } LOCALE_ITIMEMARKPOSN { time marker position } LOCALE_ICENTURY { century format specifier (short date) } LOCALE_ITLZERO { leading zeros in time field } LOCALE_IDAYLZERO { leading zeros in day field (short date) } LOCALE_IMONLZERO { leading zeros in month field (short date) } LOCALE_S1159 { AM designator } LOCALE_S2359 { PM designator } LOCALE_ICALENDARTYPE { type of calendar specifier } LOCALE_IOPTIONALCALENDAR { additional calendar types specifier } LOCALE_IFIRSTDAYOFWEEK { first day of week specifier } LOCALE_IFIRSTWEEKOFYEAR { first week of year specifier } LOCALE_SDAYNAME1 { long name for Monday } LOCALE_SDAYNAME2 { long name for Tuesday } LOCALE_SDAYNAME3 { long name for Wednesday } LOCALE_SDAYNAME4 { long name for Thursday } LOCALE_SDAYNAME5 { long name for Friday } LOCALE_SDAYNAME6 { long name for Saturday } LOCALE_SDAYNAME7 { long name for Sunday } LOCALE_SABBREVDAYNAME1 { 星期一的縮寫 } LOCALE_SABBREVDAYNAME2 { 星期二的縮寫 } LOCALE_SABBREVDAYNAME3 { 星期三的縮寫 } LOCALE_SABBREVDAYNAME4 { 星期四的縮寫 } LOCALE_SABBREVDAYNAME5 { 星期五的縮寫 } LOCALE_SABBREVDAYNAME6 { 星期六的縮寫 } LOCALE_SABBREVDAYNAME7 { 星期天的縮寫 } LOCALE_SMONTHNAME1 { long name for January } LOCALE_SMONTHNAME2 { long name for February } LOCALE_SMONTHNAME3 { long name for March } LOCALE_SMONTHNAME4 { long name for April } LOCALE_SMONTHNAME5 { long name for May } LOCALE_SMONTHNAME6 { long name for June } LOCALE_SMONTHNAME7 { long name for July } LOCALE_SMONTHNAME8 { long name for August } LOCALE_SMONTHNAME9 { long name for September } LOCALE_SMONTHNAME10 { long name for October } LOCALE_SMONTHNAME11 { long name for November } LOCALE_SMONTHNAME12 { long name for December } LOCALE_SMONTHNAME13 { long name for 13th month (if exists) } LOCALE_SABBREVMONTHNAME1 { 一月的縮寫 } LOCALE_SABBREVMONTHNAME2 { 二月的縮寫 } LOCALE_SABBREVMONTHNAME3 { 三月的縮寫 } LOCALE_SABBREVMONTHNAME4 { 四月的縮寫 } LOCALE_SABBREVMONTHNAME5 { 五月的縮寫 } LOCALE_SABBREVMONTHNAME6 { 六月的縮寫 } LOCALE_SABBREVMONTHNAME7 { 七月的縮寫 } LOCALE_SABBREVMONTHNAME8 { 八月的縮寫 } LOCALE_SABBREVMONTHNAME9 { 九月的縮寫 } LOCALE_SABBREVMONTHNAME10 { 十月的縮寫 } LOCALE_SABBREVMONTHNAME11 { 十一月的縮寫 } LOCALE_SABBREVMONTHNAME12 { 十二月的縮寫 } LOCALE_SABBREVMONTHNAME13 { 十三月的縮寫(如果有的話) } LOCALE_SPOSITIVESIGN { 正號 } LOCALE_SNEGATIVESIGN { 負號 } LOCALE_IPOSSIGNPOSN { 正號位置 } LOCALE_INEGSIGNPOSN { 負號位置 } LOCALE_IPOSSYMPRECEDES { mon sym precedes pos amt } LOCALE_IPOSSEPBYSPACE { mon sym sep by space from pos amt } LOCALE_INEGSYMPRECEDES { mon sym precedes neg amt } LOCALE_INEGSEPBYSPACE { mon sym sep by space from neg amt } LOCALE_FONTSIGNATURE { font signature } LOCALE_SISO639LANGNAME { ISO 縮寫語言名稱 } LOCALE_SISO3166CTRYNAME { ISO 縮寫國家名稱 }

Leave a Comment

Delphi 好料

http://fundementals.sourceforge.net/

Fundamentals is a collection of open source code libaries for use with the Delphi language.

The collection consists of:

  • Utility functions:
  • String operations, Dynamic array operations, System functions and Date & Time operations.

  • Unicode functions:
  • Unicode codecs and Unicode character and string functions.

  • Streams:
  • Common stream implementations that includes parsing support and binary packing.

  • Datastructures:
  • Commonly used data structures, including efficient array and dictionary implementations.

  • Sockets:
  • UDP and TCP server and client classes. Support for asynchronous or threaded modes.

  • Mathematics:
  • Units included for vectors, matrices, rational numbers and complex numbers.

    Leave a Comment

    • 工商服務

      廣告讀取中...
    • 近期留言

    • 標籤

    • 彙整