全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2660
推到 Plurk!
推到 Facebook!

inputbox的提示字字數會少SHOW出來

尚未結案
gigitahoo
一般會員


發表:8
回覆:2
積分:2
註冊:2004-09-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-13 00:15:42 IP:218.163.xxx.xxx 未訂閱
各位前輩: 不知inputbox的提示字若SHOW出來會少...該參數要去那修改呢? 我的程式碼如下:在麻煩前輩幫忙解答..小女子感激不盡.... procedure TForm1.FormCreate(Sender: TObject); var i,j,k:integer; begin button1.Caption:='計算排名'; button2.Caption:='結果(&X)'; stdnum:=strtoint(inputbox('輸入人數','請輸入','5')); with stringgrid1 do begin colcount:=3; rowcount:=6; cells[0,0]:='座號'; cells[1,0]:='成績'; cells[2,0]:='名次'; for i:=1 to stdnum do begin stringgrid1.Cells[0,i]:=inttostr(i); stringgrid1.Cells[1,i]:=inputbox('成績輸入' ,'請輸入第' inttostr(i) '位的成績',''); stringgrid1.Cells[2,i]:=inttostr(0); end; end; end;
huangeider
高階會員


發表:288
回覆:492
積分:231
註冊:2003-02-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-13 00:37:33 IP:202.145.xxx.xxx 未訂閱
我也遇過這個問題,若不問原因的話(可能是DELPHI的BUG),用英文不會缺字, 當用中文超過一字時就會漏一字了,此時我的解決方法是在要顯示的中文字後 面加兩BYTES的空字串,即可正常 堅持從洗馬桶做起
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-13 02:30:27 IP:61.222.xxx.xxx 未訂閱
會發生這個問題主要的原因,為 Delphi 預設的字型為   DefFontData: TFontData = (     Handle: 0;     Height: 0;     Pitch: fpDefault;     Style: [];     Charset : DEFAULT_CHARSET;     Name: 'MS Sans Serif'); 為英文字型,故在判斷中文長度時會失算。 您可以在 procedure TForm1.FormCreate(Sender: TObject); begin 添加 DefFontData.Name := '新細明體'; 就可以了,如此能避免被切一半的命運! DefFontData.Name := '新細明體'; inputbox('成績輸入' ,'請輸入第1位的成績','');
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-13 09:08:44 IP:221.169.xxx.xxx 未訂閱
gigitahoo:類似問題我於BCB討論區回答過好幾次,
原文參考對岸
http://www.ccrun.com/doc/go.asp?id=598
C   Builder 研究
雖然是BCB但引用全是Delphi我相信沒問題!
InputBox 可以做到應用面看你自己處理,
原Vcl\Source\dialogs.pas 不要動,也不要改(不知Delphi是否也是此。)
將dialogs.pas copy至你專案檔案下
開啟你的專案目錄下dialogs.pas
找到function InputQuery裡的注意紅字部分是你要加入或修改的部分!
function InputQuery(const ACaption, APrompt: string;
  var Value: string): Boolean;
var
  Form: TForm;
  Prompt: TLabel;
  Edit: TEdit;
  fstyle: dWord;  //這是用API實現數值型Edit!
  DialogUnits: TPoint;
  ButtonTop, ButtonWidth, ButtonHeight: Integer;
begin
  Result := False;
  Form := TForm.Create(Application);
  with Form do
    try
      Canvas.Font := Font;
      DialogUnits := GetAveCharSize(Canvas);
      BorderStyle := bsDialog;
      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;
        Left := MulDiv(8, DialogUnits.X, 4);
        Top := MulDiv(8, DialogUnits.Y, 8);
        MulDiv(164, DialogUnits.X, 4); // 保證中文顯示沒問題
        AutoSize := False;
        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;
//        PasswordChar:='*'; // 密碼方式輸入
        Text := Value;
        SelectAll;
      end;
      fstyle := GetWindowLong(Edit.Handle, GWL_STYLE);   //API實現數值型Edit
      SetWindowLong(Edit.Handle, GWL_STYLE, fstyle or ES_NUMBER);  //API實現數值型Edit
      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 := '確定'; // SMsgDlgOK; // 改成中文
        ModalResult := mrOk;
        Default := True;
        SetBounds(MulDiv(38, DialogUnits.X, 4), ButtonTop, ButtonWidth,
          ButtonHeight);
      end;
      with TButton.Create(Form) do
      begin
        Parent := Form;
        Caption := '取消'; SMsgDlgCancel; // 改成中文
        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;
紅字部分請依需要自行處理
只要你的這隻同目錄下的dialogs.pas 加入你的project即可
記著你的專案檔案只要
project-> add 專案目錄下dialogs.pas
程式裡不要Include dialogs.pas
要不將此function InputQuery(const ACaption, APrompt: string;
  var Value: string): Boolean;
Copy至你程式改個名字,如MyInputQuery也可以。
請參考!
Andy Chang 發表人 - andychang1690 於 2004/10/13 09:12:40
------
Andy Chang
gigitahoo
一般會員


發表:8
回覆:2
積分:2
註冊:2004-09-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-13 09:38:58 IP:210.202.xxx.xxx 未訂閱
感謝各位前輩的回覆
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-10-13 11:06:57 IP:61.222.xxx.xxx 未訂閱
老實說,就這個問題而言。 是不需要動到修改 dialogs.pas。 這個問題,並非 Delphi 的 BUG 主要因素為 Label 在 AutoSize 是利用 TextWidth 作判斷。 當然字型不府,判斷也會計算錯誤。 因此 Delphi 才提供 DefFontData 變數。以便我們去修改程式的預設字型。 當然如果覺得要加強 InputQuery 功能,倒不如依樣畫葫蘆。 如同 andychang1690 大大所言寫一個屬於自己的 InputQuery。
系統時間:2024-04-26 2:52:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!