- Socket error #0 –
Direct send error.
直接傳送錯誤。 - Socket error #10004 [WSAEINTR] –
Interrupted function call.
函式呼叫被中止。 - Socket error #10013 [WSAEACCES] –
Permission denied.
沒有權限。 - Socket error #10014 [WSAEFAULT] –
Bad Address.
不正確的地址。 - Socket error #10022 [WSAEINVAL] –
Invalid argument.
無效的引數(參數)。
2014年10月6日 星期一
Socket Error 錯誤號碼及原因
2014年6月26日 星期四
[Delphi 7]開啟時發生錯誤!Borland license information was found, but it is not valid for Delphi.
Borland license information was found, but it is not valid for Delphi.Youcan not run Delphi without this information.Click the 'Exit' button to exit Delphi.
如此只要將
C:\Documents and Settings\用戶名\.borland
文件夾刪除即可
再次開啟時就會自動建立好
2014年3月20日 星期四
[Delphi]視窗位置 Vcl.Forms.TPosition
以下就各個選項做說明
poDesigned
The form appears positioned on the screen and with the same height and width as it had at design time.
form 將會顯示在和你設計規劃的時候相同的大小和位置
poDefault
The form appears in a position on the screen and with a height and width determined by the operating system.
交由作業系統決定所該顯示的位置和大小,通常都會在上一個程式開啟後的位置再往右下一點
2014年1月15日 星期三
[Delphi] 利用Winsock 檢查要使用的Port 是否已被佔用
此程式會檢查給的port 是否已經被使用,如果是就+1,直到找到空著(沒有被使用)的埠為止。
function TNetServer.GetFreePort(aPort: Integer): Integer;
var
_vSock: TSocket;
_vWSAData: TWSAData;
_vAddrIn: TSockAddrIn;
begin
try
if WSAStartup(MAKEWORD(2, 2), _vWSAData) = 0 then begin
_vSock := Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
try
if _vSock <> SOCKET_ERROR then begin
_vAddrIn.sin_family := AF_INET;
_vAddrIn.sin_addr.S_addr := htonl(INADDR_ANY);
_vAddrIn.sin_port := htons(APort);
while (Bind(_vSock, _vAddrIn, SizeOf(_vAddrIn)) <> 0) and (WSAGetLastError = WSAEADDRINUSE) do
begin
inc(aPort);
_vAddrIn.sin_port := htons(aPort);
end;
end;
finally
CloseSocket(_vSock);
WSACleanup();
end;
end;
finally
Result := aPort;
end;
end;
如果有需要指定範圍,可在 18, 19行間增加如下:
if aPort > XXXXX then aPort := OOOOO;
OOOOO 是最小的埠號值
2013年12月6日 星期五
[Delphi] Break, Exit, Abort, Continue 使用
Break;
中斷執行迴圈,可從當前 for…to…do、while…do、repeat…until 執行中途跳出,繼續執行該迴圈的下一段程式碼。
Continue;
繼續迴圈,可從當前 for…to…do、while…do、repeat…until 執行中途,忽略以下程式碼,跳到迴圈頭續續執行。
Exit;
離開函式,可從當前 procedure、function 執行中跳出,繼續執行呼叫的程式碼。
Abort;
中斷函式,可從當前 procedure、function 執行中跳出,並觸發 try…except(如有將 Abort 包進 try…except)
Break, Continue 範例結果:
procedure Test;
begin
for i := 0 to 3 do
begin
if i := 0 then begin
continue;
ShowMessage('After Continue' + IntToStr(i));
end;
if i := 2 then begin
break;
ShowMessage('After Break;' + IntToStr(i));
end;
ShowMessage('End of If' + IntToStr(i));
end;
ShowMessage('End of For' + IntToStr(i));
end; // end of procedure
結果應該會依序出現
End of If 1
End of For 3
Exit, Abort 範例結果
procedure Test;
begin
try
Abort;
ShowMessage('After Abort 1');
except
ShowMessage('Enter Except 1');
end;
ShowMessage('Out try...except 1 ');
try
Exit;
ShowMessage('After Exit 2');
except
ShowMessage('Enter Except 2');
end;
ShowMessage('Out try...except 2');
end;
結果應該會依序出現
Enter Except 1
Out try…except 1
2013年12月5日 星期四
[Delphi 7](2014.3.3改)Indy 10 網路元件安裝
舊的方法原本是以下這樣,後來我裝新的XP系統時發現無法成功
首先從 http://www.indyproject.org/downloads/10/indy10.0.52_source.zip 下載壓縮檔。
(或是到這個網頁找 http://www.indyproject.org/sockets/download/files/indy10.en.aspx )
Indy 10 安裝步驟:
移除舊版 Indy 9
- 進 Delphi 後,選擇 Component –> Install Packages…
- 在 Design Packages 找有 Indy 字樣的選項後,Remove 後離開。
- 在 Delphi 裡,選擇 Tools –> Environment Options,打開 Library 標籤,刪除有Indy 的路徑。
- 在系統資料夾找所有 Indy 開頭的 Indy*.bpl 和 Indy*.dcp 檔案,並刪除。
開始安裝:
- 解壓縮剛下載的 Indy10.0.52_source.zip 檔至 您放置 Lib 的目錄 (例:C:\Program Files (x86)\Borland\Delphi7\Source\Indy10),並將底下四個目錄加入 Delphi 內的 Library 路徑。
- 打開 \System\IndySystem70.dpk ,Compile
- 打開 \Core\IndyCore70.dpk ,Compile
- 打開 \Protocols\IndyProtocols70.dpk ,Compile
- 打開 \SuperCore\IndySuperCore70.dpk,Compile
- 打開 \Core\dclIndyCore70.dpk ,Install
- 打開 \Protocols\dclIndyProtocols70.dpk,Install
- 打開 \SuperCore\dclIndySuperCore70.dpk,Install
新的方式(成功率大幅提高)
從 http://indy.fulgan.com/ZIP/ 下載開發中的Indy10,(2014.3.3)今日的版本是 Indy10_5099.zip
(下載舊方法的連結 indy10.0.52_source.zip 應該也可以,但我沒試過)
開始進行安裝
先移除原安裝的 Indy (Delphi7之後好像都會自動裝Indy9,大致和舊方式相同,這邊再寫詳細一點):
- 進 Delphi 後,選擇上方功能選項 「Component」 –> 「Install Packages…」
- 在 「Design Packages」框框裡找有「Indy」字樣的選項,點選後按「Remove」移除(如有安裝過或Delphi7之後版本應該有1,2個)
- 全部移乾淨後,按 「OK」離開
- 再選擇上方功能選項「Tools」 –> 「Environment Options」,再點開「Library」標籤
- 在「Directories」框框裡,找「Library path」的最後面,點「…」按鈕
- 尋找列表內,有任何「Indy」字樣的路徑,點選後按「Delete」刪除掉
- 刪除完後,點選「OK」離開,關掉 Delphi
- 再從檔案總管中,搜尋「系統資料夾」(就是Windows目錄)內所有的Indy開頭的檔案,應該都會在 windows/system32 裡面
確定以上步驟都完成,或是您確定沒安裝任何版本的Indy ,就可以開始進行安裝
- 解壓縮剛下載的壓縮檔到你想參照的目錄位置,我是放在 C:\Program Files (x86)\Borland\Delphi7\Source\Indy10
- 進入 \Lib 目錄,找Fulld_7.bat,點選執行 (不同版本請自行變通,這步不做應該也可以,10.0.52版沒有這檔案,請自行嘗試)
- 點擊打開 \System\IndySystem70.dpk ,然後點 Compile
- 點擊打開 \Core\IndyCore70.dpk ,然後點 Compile
- 點擊打開 \Protocols\IndyProtocols70.dpk ,然後點 Compile
- 在 Delphi 上面功能列選擇「Component」 –> 「Install Packages…」 (用點擊檔案打開後Install的方式經常失敗)
- 點「Add…」按鈕,選擇 \Core\dclIndyCore70.dpk,然後「開啟舊檔」
- 再點「Add…」按鈕,選擇 \Protocols\dclIndyProtocols70.dpk,然後「開啟舊檔」
- P.S. 「SuperCore」可以完全忽視,不用安裝
我照這個步驟的成功率目前是百分百,提供給大家試試看
參照網址 http://www.indyproject.org/Sockets/Docs/Indy10Installation.EN.aspx
2013年12月4日 星期三
[Delphi]設定Record Array不定長度
從資料庫抓取資料出來時,卻不確定筆數有幾筆,可以用這種方式,在將資料庫資料抓出來後,設定陣列的長度空間並放入資料。
定義結構 Record 及 Array
type
RDBData = Record
A:Integer;
B:String;
end;
ARDBData = Array of RDBData;
設定 Array 長度
function GetData: ARDBData;
var
dbData: ARDBData;
i: Integer;
begin
...
dbQuery.SQL.Text := 'SELECT * FROM [User]';
dbQuery.Open;
SetLength(dbData, dbQuery.RecordCount);
for i := 0 to dbQuery.RecordCount - 1 do begin
dbData[i].A := dbQuery.Fields[0].AsInteger;
dbData[i].B := dbQuery.Fields[1].AsInteger;
dbQuery.Next;
end;
Result := dbData;
...
end;
可以注意到,也可以回傳陣列沒問題
2013年9月27日 星期五
[Delphi]TADOConnection 交易
在對資料進行異動前,為避免異動失敗,造成後續存取資料不正確,因此使用ADO交易模式,在發生錯誤失敗時,回復相關異動。
主要動作如下:
- 在對資料庫進行任何異動前先 BeginTrans,開始進行新的交易 (ADOConnection 必需已與資料庫建立連接 Connected = True)
- 資料庫異動內容 Select, Insert, Update, Delete
- 確認異動內容 CommitTrans,此時將資料異動寫入資料庫
- 如發生錯誤則取消異動內容 RollBackTrans,則將所有異動取消
Code Sample:
begin
Try
ADOConnection1.BeginTrans; // 開始交易
ADOQuery1.Insert; // 或 Delete, Edit
ADOQuery1.FieldByName('fieldname').Value := ...;
ADOQuery1.Post;
ADOQuery1.Close;
ADOQuery1.SQL.Text:='............';
ADOQuery1.ExecSQL / Open;
ADOConnection1.CommitTrans; // 確認交易
Except
ADOConnection1.RollBackTrans; // 取消交易
end;
end;