InputBox 無法在 Thread 中使用? |
答題得分者是:Zard
|
hornacek
一般會員 發表:29 回覆:76 積分:21 註冊:2004-02-02 發送簡訊給我 |
|
Zard
尊榮會員 發表:24 回覆:396 積分:539 註冊:2003-11-26 發送簡訊給我 |
我試的結果是當InputBox放在Thread內時, 不知道為什麼, 他的Canvas卻尚未ready, 所以只好等Canvas ready後, 再繼續下去, 我把InputBox的碼挖出來, 修改一下就可以用了. 為了不和原版InputBox衝到, 我把它改名為ZInputBox. 把下一篇的InputBox.pas加入你的BCB Project內, 記得include InputBox.hpp 我在Win2000下用BCB5試沒問題, 如果在遇到問題, 建議你直接自已做一個InputBox, 其實實作一個InputBox是相當簡單的. 測試程式如下:
//--------------------------------------------------------------------------- #include |
Zard
尊榮會員 發表:24 回覆:396 積分:539 註冊:2003-11-26 發送簡訊給我 |
InputBox.pas上半部
unit InputBox; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; Const BTN_OK = '確定'; BTN_CANCEL = '取消'; function ZInputBox(const ACaption, APrompt, ADefault: string): string; implementation function ZGetAveCharSize(Canvas: TCanvas): TPoint; var I: Integer; Buffer: array[0..51] of Char; bOK: Boolean; begin for I := 0 to 25 do Buffer[I] := Chr(I Ord('A')); for I := 0 to 25 do Buffer[I 26] := Chr(I Ord('a')); bOK := FALSE; while(Not bOK) do begin try GetTextExtentPoint(Canvas.Handle, Buffer, 52, TSize(Result)); bOK := TRUE; except end; end; Result.X := Result.X div 52; end; |
Zard
尊榮會員 發表:24 回覆:396 積分:539 註冊:2003-11-26 發送簡訊給我 |
InputBox.pas下半部
function ZInputQuery(const ACaption, APrompt: string; var Value: string): Boolean; var Form: TForm; Prompt: TLabel; Edit: TEdit; DialogUnits: TPoint; ButtonTop, ButtonWidth, ButtonHeight: Integer; begin Result := False; Form := TForm.Create(Application); with Form do try Canvas.Font := Font; BorderStyle := bsDialog; DialogUnits := ZGetAveCharSize(Canvas); Caption := ACaption; ClientWidth := MulDiv(180, DialogUnits.X, 4); ClientHeight := MulDiv(63, DialogUnits.Y, 8); Position := poScreenCenter; Prompt := TLabel.Create(Form); with Prompt do begin Parent := Form; AutoSize := True; Left := MulDiv(8, DialogUnits.X, 4); Top := MulDiv(8, DialogUnits.Y, 8); Caption := APrompt; end; Edit := TEdit.Create(Form); with Edit do begin Parent := Form; Left := Prompt.Left; Top := MulDiv(19, DialogUnits.Y, 8); Width := MulDiv(164, DialogUnits.X, 4); MaxLength := 255; Text := Value; SelectAll; end; ButtonTop := MulDiv(41, DialogUnits.Y, 8); ButtonWidth := MulDiv(50, DialogUnits.X, 4); ButtonHeight := MulDiv(14, DialogUnits.Y, 8); with TButton.Create(Form) do begin Parent := Form; Caption := BTN_OK; ModalResult := mrOk; Default := True; SetBounds(MulDiv(38, DialogUnits.X, 4), ButtonTop, ButtonWidth, ButtonHeight); end; with TButton.Create(Form) do begin Parent := Form; Caption := BTN_CANCEL; ModalResult := mrCancel; Cancel := True; SetBounds(MulDiv(92, DialogUnits.X, 4), ButtonTop, ButtonWidth, ButtonHeight); end; if ShowModal = mrOk then begin Value := Edit.Text; Result := True; end; finally Form.Free; end; end; function ZInputBox(const ACaption, APrompt, ADefault: string): string; begin Result := ADefault; ZInputQuery(ACaption, APrompt, Result); end; end. |
hornacek
一般會員 發表:29 回覆:76 積分:21 註冊:2004-02-02 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |