Delphi XE2のInputQuery/InputBoxに問題があります。InputQuery書式設定の問題
入力領域が適切でない(テキストの下にある)
入力フォームを作成する前に再整列する方法はありますか?
ありがとうございます!
Delphi XE2のInputQuery/InputBoxに問題があります。InputQuery書式設定の問題
入力領域が適切でない(テキストの下にある)
入力フォームを作成する前に再整列する方法はありますか?
ありがとうございます!
InputQuery()
は、このように使用するようには設計されていません。プロンプトテキストは、テキストフィールドの左側に表示される短いラベル(TLabeledEdit
に似ています)を意味します。試行しているように、プロンプトの上に指示を表示するようには設計されていません。この状況は、必要なコントロールやレイアウトを使用して独自のカスタムフォームを作成するだけで、はるかに優れた処理が可能になります。例えば、言われて、InputQuery()
は、カスタムVCL TForm
を使用して実装されているので、あなたが何であるかを達成するために技術的に可能であること、しかし
を日付と時刻のTDateTimePicker
、TCheckBox
またはTRadioGroup
を使用して達成しようとしている。 TScreen.OnActiveFormChange
イベントを使用して、フォームオブジェクトが表示されたときにフォームオブジェクトにアクセスし、必要に応じて操作できます。また
procedure TMyForm.ActiveFormChanged(Sender: TObject);
var
Form: TCustomForm;
Prompt: TLabel;
Edit: TEdit;
Ctrl: TControl;
I, J, ButtonTop: Integer;
begin
Form := Screen.ActiveCustomForm;
if (Form = nil) or (Form.ClassName <> 'TInputQueryForm') then Exit;
for I := 0 to Form.ControlCount-1 do
begin
Ctrl := Form.Controls[i];
if Ctrl is TLabel then
begin
Prompt := TLabel(Ctrl);
end
else if Ctrl is TEdit then
begin
Edit := TEdit(Ctrl);
end;
end;
Edit.SetBounds(Prompt.Left, Prompt.Top + Prompt.Height + 5, Prompt.Width, Edit.Height);
Form.ClientWidth := (Edit.Left * 2) + Edit.Width;
ButtonTop := Edit.Top + Edit.Height + 15;
J := 0;
for I := 0 to Form.ControlCount-1 do
begin
Ctrl := Form.Controls[i];
if Ctrl is TButton then
begin
Ctrl.SetBounds(Form.ClientWidth - ((Ctrl.Width + 15) * (2-J)), ButtonTop, Ctrl.Width, Ctrl.Height);
Form.ClientHeight := Ctrl.Top + Ctrl.Height + 13;
Inc(J);
end;
end;
end;
procedure TMyForm.DoSomething;
var
value: string;
begin
Screen.OnActiveFormChange := ActiveFormChanged;
try
InputQuery('Enter New Schedule', 'Format: <Second> <Minute> <Hour> <Day_of_the_Month> <Month_of_the_Year> <Day_of_the_Week> <Year>.'#10'Use * for repeating cycles. ex: 0 0 7 * * * * (trigger at 7AM everyday)', value);
finally
Screen.OnActiveFormChange := nil;
end;
end;
:たとえば
class procedure TScreenEvents.ActiveFormChanged(Sender: TObject);
var
Form: TCustomForm;
Instructions: TLabel;
Ctrl: TControl;
I, J, K, Offset: Integer;
begin
Form := Screen.ActiveCustomForm;
if (Form = nil) or (Form.ClassName <> 'TInputQueryForm') then Exit;
for I := 0 to Form.ControlCount-1 do
begin
Ctrl := Form.Controls[I];
if Ctrl is TLabel then
begin
Instructions := TLabel.Create(Form);
Instructions.Parent := Form;
Instructions.Caption := 'Format: <Second> <Minute> <Hour> <Day_of_the_Month> <Month_of_the_Year> <Day_of_the_Week> <Year>.'#10'Use * for repeating cycles. ex: 0 0 7 * * * * (trigger at 7AM everyday)';
Instructions.SetBounds(Ctrl.Left, Ctrl.Top, Instructions.Width, Instructions.Height);
Offset := Instructions.Top + Instructions.Height + 5;
Form.ClientWidth := Instructions.Width + (Instructions.Left * 2);
K := 0;
for J := 0 to Form.ControlCount-1 do
begin
Ctrl := Form.Controls[J];
if Ctrl <> Instructions then
begin
Ctrl.Top := Ctrl.Top + Offset;
if Ctrl is TEdit then
begin
Ctrl.Width := (Form.ClientWidth - Ctrl.Left - Instructions.Left);
end
else if Ctrl is TButton then
begin
Ctrl.Left := (Form.ClientWidth - (Ctrl.Width + 5) * (2-K));
Inc(K);
end;
end;
end;
Form.ClientHeight := Form.ClientHeight + Offset;
Break;
end;
end;
end;
procedure TMyForm.DoSomething;
var
value: string;
begin
Screen.OnActiveFormChange := ActiveFormChanged;
try
InputQuery('Enter New Schedule', 'Value', value);
finally
Screen.OnActiveFormChange := nil;
end;
end;
のInputQueryがどのように動作するかではありません
。別のものが必要な場合は、新しいフォームを作成して、それを見たいようにします。 (あなたがここでやったようなことをすれば、私のユーザーは私を撃つだろう) –
完全に同意する!このプログラムは私によって使用されることを意図しています。私は組み込み関数を使用して時間を節約できるかどうかを知りたかっただけです。私は悪臭の入力を確認する必要はありません:) – ELCouz
それはあなただけが使用する場合は、データを入力するためにどのような形式で指示を与える必要がありますか?プロンプトを* Type here:*に変更するだけで、問題は解決します。フォーム上にラベル、編集、および2つのボタンをドロップするのにどれくらい時間がかかりますか?クラス関数を追加することもできます: 'Input:= TMyForm.GetTheText;'これは、フォームを作成して表示し、約5秒で入力を返すことができます。 –