我想從用戶那裏得到多種不同類型的值(時間,壓力,名稱......)。我想定製我的輸入框。但它只需要一個值。有沒有辦法使用delphi inputbox有多個值?
有沒有什麼辦法可以解決這種情況,或者有什麼組件可以使用?
我想從用戶那裏得到多種不同類型的值(時間,壓力,名稱......)。我想定製我的輸入框。但它只需要一個值。有沒有辦法使用delphi inputbox有多個值?
有沒有什麼辦法可以解決這種情況,或者有什麼組件可以使用?
弗朗索瓦是對的。你已經達到了你得到的工具的極限。 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和表格單位。你已經包括了這些,所以最糟糕的是已經過去了。將表單添加到已具有至少一個表單的項目並不會影響項目大小,特別是不是我上面描述的僅具有八個控件的表單。
你是什麼意思的「inputbox」 - 一個TEdit?輸入有許多不同的組件,可以做很多不同的事情。對於一個名字,TEdit是非常好的 - 但是隨着時間的推移,你可能需要一個日曆控件,而對於壓力,你可能想要使用一個看起來很棒的數字控件。
是的,設計一個窗體!
Dialogs.InputBox旨在從用戶那裏獲得1個字符串,快速而簡單。
如果你想要更多,你必須設計一個入境表格。
如果您想要一個基本的對話框,您可以查看Dialogs.InputQuery中的代碼,並將其用作編寫自己的過程的起點。
如果你想要真正的交易,你必須挖掘和編碼一個真正的窗體。
羅布肯尼迪是正確的..輸入框不是一個好的選擇... 你到底想要保存什麼? Exe空間,資源或源代碼?或者你只是想用你的「綠色」代碼來保存環境?
如果你看看InputQuery函數,你會發現它所做的是創建一個TForm並創建一些TButtons/TLabels/TEdit,定位並顯示模態的形式。
正是你會做一個新的形式,你會添加到您的項目..你身邊可以驗證,定製控件並將其定位甚至添加提示...
配合新形式。 ..
您不必將每個表單設置爲自動創建,在創建表單進入項目選項後,選擇表單選項並將不想自動創建的所有表單移動到右側。
我最普遍使用這些非自動生成的表單的模式是類似以下內容:
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方法方法從記錄或類認爲是值填充對話框在例程中使用。我從來不試圖從窗體外部操縱窗體上的控件,而是編寫例程在窗體本身中執行它。
沒有必要得到討厭的弗朗索瓦。 –
謝謝,但我想讓我的軟件更輕,所以我不想在我的項目中添加更多的表單。 有一個例子,我發現,但它很難理解.. :( http://www.delphipages.com/forum/showthread.php?t=154839 – Rapunzo
我想我太累了,不知道它可能是解釋爲我現在看到了......改變了。 –