2009-12-10 89 views

回答

7

弗朗索瓦是對的。你已經達到了你得到的工具的極限。 InputBox根本不是爲複雜輸入而設計的,它也不是爲擴展以處理多個值而設計的。

The page you linked to在你的評論中有一個例子,但它的表現很差,所以我不會責怪你誤解它。我花了一些讀也得到了。其核心是底部的MyAsk功能。 (忽略頂部的TAppendThread類聲明,沒用。)MyAsk接受帶有提示和值的記錄列表,並且對於每條記錄,它調用InputBox向用戶請求值。沒有記錄可能會更容易理解。它可以被改寫這樣的:

procedure MultiInputBox(const Prompts: array of string; var Values: array of string]); 
var 
    i: Integer; 
begin 
    Assert(Length(Prompts) = Length(Values)); 
    for i := 0 to High(Prompts) do begin 
    Values[i] := InputBox(Application.Title, Prompts[i], Values[i]); 
    end; 
end; 

這樣稱呼它:

TempTime := TimeToStr(DefaultTime); 
TempPressure := IntToStr(DefaultPressure); 
TempName := DefaultName; 
MultiInputBox(['Time', 'Pressure', 'Name'], [TempTime, TempPressure, TempName]); 
TimeToUse := StrToTime(TempTime); 
PressureToUse := StrToInt(TempPressure); 
NameToUse := TempName; 

這是一個可怕的接口爲用戶,雖然。沒有辦法返回,沒有辦法取消,沒有跡象表明審訊將持續多久,並且沒有辦法強制某些數據類型的格式。如果你設計一個自定義表單來獲得你所需要的信息,那麼你真的會變得更好。您正在使用一種工具來設計關於世界上最簡單的事物的表格。不要抵制這一點。

如果您需要獲取時間,壓力和名稱,然後製作一個帶有三個輸入控件的窗體。時間使用TDateTimePicker,對於數字輸入請考慮TSpinEdit,並使用TEdit作爲名稱。將TLabel控件放在每個輸入旁邊,以便用戶知道每個輸入的用途。將確定和取消按鈕放在窗體上。設置各種其他表單屬性,例如邊框樣式和標題。有幾乎沒有代碼寫在那種形式。不過,您可以自由添加代碼來驗證輸入值,以確保它們有意義。

要使用它,只需創建它,填充其初始值,以模態方式顯示它,並在關閉時讀取新值。

var 
    form: TDatePressureNameDialog; 
begin 
    form := TDatePressureNameDialog.Create(nil); 
    try 
    form.TimePicker.Value := DefaultTime; 
    form.PressureEdit.Value := DefaultPressure; 
    form.NameEdit.Text := DefaultName; 
    if form.ShowModal = mrOK then begin 
     TimeToUse := Frac(form.TimePicker.Value); 
     PressureToUse := form.PressureEdit.Value; 
     NameToUse := form.NameEdit.Text; 
    end; 
    finally 
    form.Free; 
    end; 
end; 

另請注意我如何檢查ShowModal方法的結果。這可以讓你知道用戶是按下「確定」還是「取消」來關閉表單。您不能用InputBox這樣做,它總是返回一個字符串。 (InputQuery可以告訴你這些信息,這是這兩種功能之間的主要區別,但這並不能真正使這兩種功能都值得在你的情況下使用)。

不要擔心這個新的表單類別你的項目。對項目規模影響最大的兩件事是SysUtils表格單位。你已經包括了這些,所以最糟糕的是已經過去了。將表單添加到已具有至少一個表單的項目並不會影響項目大小,特別是不是我上面描述的僅具有八個控件的表單。

3

你是什麼意思的「inputbox」 - 一個TEdit?輸入有許多不同的組件,可以做很多不同的事情。對於一個名字,TEdit是非常好的 - 但是隨着時間的推移,你可能需要一個日曆控件,而對於壓力,你可能想要使用一個看起來很棒的數字控件。

3

是的,設計一個窗體!

Dialogs.InputBox旨在從用戶那裏獲得1個字符串,快速而簡單。
如果你想要更多,你必須設計一個入境表格。
如果您想要一個基本的對話框,您可以查看Dialogs.InputQuery中的代碼,並將其用作編寫自己的過程的起點。

如果你想要真正的交易,你必須挖掘和編碼一個真正的窗體。

+3

沒有必要得到討厭的弗朗索瓦。 –

+0

謝謝,但我想讓我的軟件更輕,所以我不想在我的項目中添加更多的表單。 有一個例子,我發現,但它很難理解.. :( http://www.delphipages.com/forum/showthread.php?t=154839 – Rapunzo

+0

我想我太累了,不知道它可能是解釋爲我現在看到了......改變了。 –

0

羅布肯尼迪是正確的..輸入框不是一個好的選擇... 你到底想要保存什麼? Exe空間,資源或源代碼?或者你只是想用你的「綠色」代碼來保存環境?

如果你看看InputQuery函數,你會發現它所做的是創建一個TForm並創建一些TButtons/TLabels/TEdit,定位並顯示模態的形式。

正是你會做一個新的形式,你會添加到您的項目..你身邊可以驗證,定製控件並將其定位甚至添加提示...

配合新形式。 ..

0

您不必將每個表單設置爲自動創建,在創建表單進入項目選項後,選擇表單選項並將不想自動創建的所有表單移動到右側。

我最普遍使用這些非自動生成的表單的模式是類似以下內容:

Function GetValuesFromDialog : boolean; 
var 
    dlg : tValuesDialog; 
begin 
    result := false; 
    dlg := tValuesDialog.Create(nil); 
    try 
    // set initial values in dialog 
    dlg.SetValues(rData); 
    // show the dialog 
    result := dlg.ShowModal = mrOk; 
    // pull values from dialog 
    if result then 
     dlg.GetValues(rData); 
    finally 
    dlg.free; 
    end; 
end; 

中的GetValues/setValues方法方法從記錄或類認爲是值填充對話框在例程中使用。我從來不試圖從窗體外部操縱窗體上的控件,而是編寫例程在窗體本身中執行它。

相關問題