心得分享系列(BCB) |
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
心得分享 : 如何將自己的 AP 自動被 Focused ■前言
最近在寫 POS 第二片螢幕做媒體播放時,媒體播放由於是呼叫另一個獨立執行檔(因為不想跟 POS 主程式混在一起寫),發覺焦點會跑到媒體播放程式上,本想說用以前的知識,先記住主程式的 Handle , 再用下列方法中的幾個方法
ShowWindow(Handle)
BringWindowToTop(Handle)
SetForegroundWindow(Handle)
SetActiveWindow(Handle)
Application->BringToFront()
就可將焦點自動帶回主程式
沒想到主程式是會被帶到 Top 沒錯
但似乎不能自動被 Focused
(按鍵主控權仍然在媒體播放程式上)
且執行上述 API 後
底下工作列,我主程式的小圖示會一閃一閃
表 API 有作用 , 但 就是一定要人用 MOUSE 去點一下
才會被 Focused (鍵盤輸入才會回到主程式)
但我的 POS 程式是無滑鼠系統,
鍵盤也是 POS 專屬鍵盤(沒有 ALT+Tab 可以切換程式焦點)
POS 程式上遺失焦點是件很嚴重的事
後來問人終於得到答案,在此分享:
在主程式中設個 Timer ,隨時檢查焦點並將焦點設回到主程式中
void __fastcall TForm1::Timer1Timer(TObject *Sender) { SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, SPIF_SENDCHANGE); SetForegroundWindow(Application->MainForm->Handle); }<< BCB 源碼任務 http://home.kimo.com.tw/bruce0829/ >> |
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
【文章】取得檔案 MD5 值副函式
【作者】源碼任務 bruce0211@yahoo.com.tw 2005/08/08
【內文】心得分享系列 ■前言 目前因工作專案, 急須一個取得檔案 MD5 值的副函式 , 由於環境限制無法外掛 DLL ,
結果找遍所有資料 , 不是不支援 BCB , 就是號稱支援 BCB 的 DELPHI 元件或單元 ,
有語法上的問題(不知該元件作者到底有無在 BCB 上測過 ??) , 根本無法轉給 BCB 用
INDY 內有個單元叫 IdHashMessageDigest.pas , 有支援取得檔案 MD5 值的函式 ,
但不是每個 INDY 版本都有附這個單元 , 且在 BCB 上仍有問題 , 所以火大 , 參照
INDY 原始碼 , 直接寫成 BCB 副函式 , 以後就不用再靠那些裝不起來的元件或是
內部黑箱作業的 DLL ■ BCB 版副函式 (MyHashMD5.cpp)
//=========================================================================== //MyHashMD5.h //=========================================================================== #ifndef MyHashMD5H #define MyHashMD5H typedef DWORD T4x4LongWordRecord[4]; typedef Byte T512BitRecord[64]; typedef DWORD T16x4LongWordRecord[16]; String __fastcall HashValue(TStream* AStream); void __fastcall MDCoder(); DWORD __fastcall ROL(DWORD AVal, Byte AShift); #endif //=========================================================================== //MyHashMD5.cpp //=========================================================================== #include■ Delphi 版副函式 (MyHashMD5.pas) //=========================================================================== //MyHashMD5.pas //=========================================================================== unit MyHashMD5; interface uses Classes, SysUtils, Dialogs, Forms; type T16x4LongWordRecord = array[0..15] of LongWord; T4x4LongWordRecord = array [0..3] of LongWord; T512BitRecord = array [0..63] of byte; TIdBytes = array of LongWord; const MD5_INIT_VALUES: T4x4LongWordRecord = ( $67452301, $EFCDAB89, $98BADCFE, $10325476); MD5_SINE : array [1..64] of LongWord = ( { Round 1. } $d76aa478, $e8c7b756, $242070db, $c1bdceee, $f57c0faf, $4787c62a, $a8304613, $fd469501, $698098d8, $8b44f7af, $ffff5bb1, $895cd7be, $6b901122, $fd987193, $a679438e, $49b40821, { Round 2. } $f61e2562, $c040b340, $265e5a51, $e9b6c7aa, $d62f105d, $02441453, $d8a1e681, $e7d3fbc8, $21e1cde6, $c33707d6, $f4d50d87, $455a14ed, $a9e3e905, $fcefa3f8, $676f02d9, $8d2a4c8a, { Round 3. } $fffa3942, $8771f681, $6d9d6122, $fde5380c, $a4beea44, $4bdecfa9, $f6bb4b60, $bebfbc70, $289b7ec6, $eaa127fa, $d4ef3085, $04881d05, $d9d4d039, $e6db99e5, $1fa27cf8, $c4ac5665, { Round 4. } $f4292244, $432aff97, $ab9423a7, $fc93a039, $655b59c3, $8f0ccc92, $ffeff47d, $85845dd1, $6fa87e4f, $fe2ce6e0, $a3014314, $4e0811a1, $f7537e82, $bd3af235, $2ad7d2bb, $eb86d391 ); //--------------------------------------------------------------------------- function HashValue(AStream: TStream): AnsiString; overload; procedure MDCoder; function ROL(AVal: LongWord; AShift: Byte): LongWord; //--------------------------------------------------------------------------- implementation var FState: T4x4LongWordRecord; FCBuffer: T512BitRecord; //FState: array [0..3] of LongWord; //FCBuffer: array [0..63] of byte; //--------------------------------------------------------------------------- function HashValue(AStream: TStream): AnsiString; overload; var LStartPos: Integer; LBitSize, LSize: Int64; I: Integer; r: String; S,S1: String; begin LStartPos := AStream.Position; LSize := AStream.Size - LStartPos; // A straight assignment would be by ref on dotNET. for I := 0 to 3 do FState[I] := MD5_INIT_VALUES[I]; while LSize - AStream.Position >= 64 do begin AStream.Read(FCBuffer, 64); MDCoder; end; // Read the last set of bytes. LStartPos := AStream.Read(FCBuffer, 64); // Append one bit with value 1 FCBuffer[LStartPos] := $80; LStartPos := LStartPos 1; // Must have sufficient space to insert the 64-bit size value if LStartPos > 56 then begin for I := LStartPos to 63 do FCBuffer[I] := 0; MDCoder; LStartPos := 0; end; // Pad with zeroes. Leave room for the 64 bit size value. for I := LStartPos to 55 do FCBuffer[I] := 0; // Append the Number of bits processed. LBitSize := LSize * 8; for I := 56 to 63 do begin FCBuffer[I] := LBitSize and $FF; LBitSize := LBitSize shr 8; end; MDCoder; SetLength(S, 16); Move(FState, S[1], 16); for i := 1 to Length(S) do begin S1 := S1 Format('x', [Byte(S[i])]); end; while Pos(' ', S1) > 0 do S1[Pos(' ', S1)] := '0'; Result:=S1; end; //--------------------------------------------------------------------------- procedure MDCoder; var A, B, C, D : LongWord; i: Integer; x : T16x4LongWordRecord; // 64-byte buffer begin A := FState[0]; B := FState[1]; C := FState[2]; D := FState[3]; for i := 0 to 15 do begin x[i] := FCBuffer[i*4 0] (FCBuffer[i*4 1] shl 8) (FCBuffer[i*4 2] shl 16) (FCBuffer[i*4 3] shl 24); end; { Round 1 } A := ROL(A (((D xor C) and B) xor D) x[ 0] MD5_SINE[ 1], 7) B; D := ROL(D (((C xor B) and A) xor C) x[ 1] MD5_SINE[ 2], 12) A; C := ROL(C (((B xor A) and D) xor B) x[ 2] MD5_SINE[ 3], 17) D; B := ROL(B (((A xor D) and C) xor A) x[ 3] MD5_SINE[ 4], 22) C; A := ROL(A (((D xor C) and B) xor D) x[ 4] MD5_SINE[ 5], 7) B; D := ROL(D (((C xor B) and A) xor C) x[ 5] MD5_SINE[ 6], 12) A; C := ROL(C (((B xor A) and D) xor B) x[ 6] MD5_SINE[ 7], 17) D; B := ROL(B (((A xor D) and C) xor A) x[ 7] MD5_SINE[ 8], 22) C; A := ROL(A (((D xor C) and B) xor D) x[ 8] MD5_SINE[ 9], 7) B; D := ROL(D (((C xor B) and A) xor C) x[ 9] MD5_SINE[10], 12) A; C := ROL(C (((B xor A) and D) xor B) x[10] MD5_SINE[11], 17) D; B := ROL(B (((A xor D) and C) xor A) x[11] MD5_SINE[12], 22) C; A := ROL(A (((D xor C) and B) xor D) x[12] MD5_SINE[13], 7) B; D := ROL(D (((C xor B) and A) xor C) x[13] MD5_SINE[14], 12) A; C := ROL(C (((B xor A) and D) xor B) x[14] MD5_SINE[15], 17) D; B := ROL(B (((A xor D) and C) xor A) x[15] MD5_SINE[16], 22) C; { Round 2 } A := ROL(A (C xor (D and (B xor C))) x[ 1] MD5_SINE[17], 5) B; D := ROL(D (B xor (C and (A xor B))) x[ 6] MD5_SINE[18], 9) A; C := ROL(C (A xor (B and (D xor A))) x[11] MD5_SINE[19], 14) D; B := ROL(B (D xor (A and (C xor D))) x[ 0] MD5_SINE[20], 20) C; A := ROL(A (C xor (D and (B xor C))) x[ 5] MD5_SINE[21], 5) B; D := ROL(D (B xor (C and (A xor B))) x[10] MD5_SINE[22], 9) A; C := ROL(C (A xor (B and (D xor A))) x[15] MD5_SINE[23], 14) D; B := ROL(B (D xor (A and (C xor D))) x[ 4] MD5_SINE[24], 20) C; A := ROL(A (C xor (D and (B xor C))) x[ 9] MD5_SINE[25], 5) B; D := ROL(D (B xor (C and (A xor B))) x[14] MD5_SINE[26], 9) A; C := ROL(C (A xor (B and (D xor A))) x[ 3] MD5_SINE[27], 14) D; B := ROL(B (D xor (A and (C xor D))) x[ 8] MD5_SINE[28], 20) C; A := ROL(A (C xor (D and (B xor C))) x[13] MD5_SINE[29], 5) B; D := ROL(D (B xor (C and (A xor B))) x[ 2] MD5_SINE[30], 9) A; C := ROL(C (A xor (B and (D xor A))) x[ 7] MD5_SINE[31], 14) D; B := ROL(B (D xor (A and (C xor D))) x[12] MD5_SINE[32], 20) C; { Round 3 } A := ROL(A (B xor C xor D) x[ 5] MD5_SINE[33], 4) B; D := ROL(D (A xor B xor C) x[ 8] MD5_SINE[34], 11) A; C := ROL(C (D xor A xor B) x[11] MD5_SINE[35], 16) D; B := ROL(B (C xor D xor A) x[14] MD5_SINE[36], 23) C; A := ROL(A (B xor C xor D) x[ 1] MD5_SINE[37], 4) B; D := ROL(D (A xor B xor C) x[ 4] MD5_SINE[38], 11) A; C := ROL(C (D xor A xor B) x[ 7] MD5_SINE[39], 16) D; B := ROL(B (C xor D xor A) x[10] MD5_SINE[40], 23) C; A := ROL(A (B xor C xor D) x[13] MD5_SINE[41], 4) B; D := ROL(D (A xor B xor C) x[ 0] MD5_SINE[42], 11) A; C := ROL(C (D xor A xor B) x[ 3] MD5_SINE[43], 16) D; B := ROL(B (C xor D xor A) x[ 6] MD5_SINE[44], 23) C; A := ROL(A (B xor C xor D) x[ 9] MD5_SINE[45], 4) B; D := ROL(D (A xor B xor C) x[12] MD5_SINE[46], 11) A; C := ROL(C (D xor A xor B) x[15] MD5_SINE[47], 16) D; B := ROL(B (C xor D xor A) x[ 2] MD5_SINE[48], 23) C; { Round 4 } A := ROL(A ((B or not D) xor C) x[ 0] MD5_SINE[49], 6) B; D := ROL(D ((A or not C) xor B) x[ 7] MD5_SINE[50], 10) A; C := ROL(C ((D or not B) xor A) x[14] MD5_SINE[51], 15) D; B := ROL(B ((C or not A) xor D) x[ 5] MD5_SINE[52], 21) C; A := ROL(A ((B or not D) xor C) x[12] MD5_SINE[53], 6) B; D := ROL(D ((A or not C) xor B) x[ 3] MD5_SINE[54], 10) A; C := ROL(C ((D or not B) xor A) x[10] MD5_SINE[55], 15) D; B := ROL(B ((C or not A) xor D) x[ 1] MD5_SINE[56], 21) C; A := ROL(A ((B or not D) xor C) x[ 8] MD5_SINE[57], 6) B; D := ROL(D ((A or not C) xor B) x[15] MD5_SINE[58], 10) A; C := ROL(C ((D or not B) xor A) x[ 6] MD5_SINE[59], 15) D; B := ROL(B ((C or not A) xor D) x[13] MD5_SINE[60], 21) C; A := ROL(A ((B or not D) xor C) x[ 4] MD5_SINE[61], 6) B; D := ROL(D ((A or not C) xor B) x[11] MD5_SINE[62], 10) A; C := ROL(C ((D or not B) xor A) x[ 2] MD5_SINE[63], 15) D; B := ROL(B ((C or not A) xor D) x[ 9] MD5_SINE[64], 21) C; Inc(FState[0], A); Inc(FState[1], B); Inc(FState[2], C); Inc(FState[3], D); end; //--------------------------------------------------------------------------- function ROL(AVal: LongWord; AShift: Byte): LongWord; var r: LongWord; begin r:= (AVal shl AShift) or (AVal shr (32 - AShift)); Result := r; end; end.■ 使用方法 [BCB] #include "classes.hpp" #include "MyHashMD5.h" //加入 include void __fastcall TForm1::Button1Click(TObject *Sender) { TFileStream *fs; String sFileName="c:\\clock3.wmv"; fs = new TFileStream(sFileName, fmOpenRead); ShowMessage(HashValue(fs)); //秀出該檔案的 MD5 值 delete fs; } [Delphi] uses MyHashMD5; //加入 uses procedure TForm1.Button1Click(Sender: TObject); var fs : TFileStream; FileHandle: Integer; sFileName: String; begin sFileName:='c:\clock3.wmv'; fs := TFileStream.Create(sFileName, fmOpenRead); ShowMessage(HashValue(fs)); //秀出該檔案的 MD5 值 fs.Free; end; |
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
【文章】讓 ADO 元件產生的 XML 檔給 ClientDataSet 元件使用
【作者】源碼任務 bruce0211@yahoo.com.tw 2006/10/05 【內文】(本貼版格式有異常 , 有些程式碼內容被遮避 , 需要者再來信索取完整源碼) ■ 前言 目前因工作需要 , 不能透過需版權限制的 Connection 或 3'tier 架構連到資料庫 , 故需將 QUERY 查詢結果變成文字檔格式 , 再透過檔案傳輸方式 , 將資料轉給網路上的另一台電腦使用 , 相同的元件產生或讀取 XML 檔沒問題 , 但 ADO 元件產生的 XML 檔餵給 ClientDataSet 元件使用就不行 , 查了一下資料 , ClientDataSet 所使用的 XML 好像是一種所謂的 DataPacket 格式的 XML 檔 , BCB 6 及 Delphi 7 上好像有現成元件可做轉換動作 , 另外 B6 & D7 也有提供一個叫 XML Mapper 的轉換工具 , 不過無奈試了半天 , B6 & D7 提供的元件我試不出來 , 轉檔一直有問題 後來乾脆自己寫轉檔函式 , 在沒有 XML 轉檔元件的舊 B5 上也可使用 本函式尚未測試周全 , 用於一般資料型態(STRING , INT , FLOAT)應無問題 但遇到圖形或 MEMO 型態的欄位值 , 尚須再研究改寫 ■ 用法 //寫出 //ADOQuery1->SaveToFile("c:\\test.xml",pfXML); //這種方式產生的 XML 不能給 ClientDataSet 用 (非 DataPacket 格式) ADOQueryToDataPacket(ADOQuery1,"c:\\test.xml"); //要用自寫的函式來轉 //讀取 ClientDataSet1->LoadFromFile("c:\\test.xml"); ClientDataSet1->Open(); ■ 函式 void __fastcall TForm1::ADOQueryToDataPacket(TADOQuery *TmpQuery, String fn) { TmpQuery->DisableControls(); String tmp=""; TStringList *TmpList= new TStringList; TmpList->Clear(); tmp=tmp "<?xml version=\"1.0\" standalone=\"yes\" ?> "; tmp=tmp " String datatype; for (int i=0; i { tmp=tmp " switch (TmpQuery->Fields->Fields[i]->DataType) { case 0 : datatype="ftUnknown" ; break; case 1 : datatype="ftString" ; tmp=tmp "string"; break; case 2 : datatype="ftSmallint" ; break; case 3 : datatype="ftInteger" ; tmp=tmp "i4"; break; case 4 : datatype="ftWord" ; break; case 5 : datatype="ftBoolean" ; break; case 6 : datatype="ftFloat" ; tmp=tmp "r8"; break; case 7 : datatype="ftCurrency" ; break; case 8 : datatype="ftBCD" ; break; case 9 : datatype="ftDate" ; break; case 10 : datatype="ftTime" ; break; case 11 : datatype="ftDateTime" ; tmp=tmp "dateTime"; break; case 12 : datatype="ftBytes" ; break; case 13 : datatype="ftVarBytes" ; break; case 14 : datatype="ftAutoInc" ; break; case 15 : datatype="ftBlob" ; break; case 16 : datatype="ftMemo" ; break; case 17 : datatype="ftGraphic" ; break; case 18 : datatype="ftFmtMemo" ; break; case 19 : datatype="ftParadoxOle" ; break; case 20 : datatype="ftDBaseOle" ; break; case 21 : datatype="ftTypedBinary" ; break; case 22 : datatype="ftCursor" ; break; case 23 : datatype="ftFixedChar" ; break; case 24 : datatype="ftWideString" ; break; case 25 : datatype="ftLargeint" ; break; case 26 : datatype="ftADT" ; break; case 27 : datatype="ftArray" ; break; case 28 : datatype="ftReference" ; break; case 29 : datatype="ftDataSet" ; break; case 30 : datatype="ftOraBlob" ; break; case 31 : datatype="ftOraClob" ; break; case 32 : datatype="ftVariant" ; break; case 33 : datatype="ftInterface" ; break; case 34 : datatype="ftIDispatch" ; break; case 35 : datatype="ftGuid" ; break; } if (TmpQuery->Fields->Fields[i]->DataType==1) //string 要再處理 { tmp=tmp "\" WIDTH=\"" IntToStr(TmpQuery->Fields->Fields[i]->DataSize-1); // 為何要減 1 才對 ? } tmp=tmp "\" />"; } tmp=tmp " TmpQuery->First(); while(!TmpQuery->Eof) { tmp=tmp " { tmp = tmp TmpQuery->Fields->Fields[i]->FieldName "=\""; tmp = tmp TmpQuery->Fields->Fields[i]->AsString "\" "; } tmp=tmp "/>"; TmpQuery->Next(); } tmp=tmp ""; tmp=tmp " TmpList->Add(tmp); TmpList->SaveToFile(fn); delete TmpList; TmpQuery->EnableControls(); } |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |