2017-02-10 17 views
0

Delphi XE2のInputQuery/InputBoxに問題があります。InputQuery書式設定の問題

入力領域が適切でない(テキストの下にある)

入力フォームを作成する前に再整列する方法はありますか?

enter image description here

ありがとうございます!

+2

。別のものが必要な場合は、新しいフォームを作成して、それを見たいようにします。 (あなたがここでやったようなことをすれば、私のユーザーは私を撃つだろう) –

+0

完全に同意する!このプログラムは私によって使用されることを意図しています。私は組み込み関数を使用して時間を節約できるかどうかを知りたかっただけです。私は悪臭の入力を確認する必要はありません:) – ELCouz

+0

それはあなただけが使用する場合は、データを入力するためにどのような形式で指示を与える必要がありますか?プロンプトを* Type here:*に変更するだけで、問題は解決します。フォーム上にラベル、編集、および2つのボタンをドロップするのにどれくらい時間がかかりますか?クラス関数を追加することもできます: 'Input:= TMyForm.GetTheText;'これは、フォームを作成して表示し、約5秒で入力を返すことができます。 –

答えて

1

InputQuery()は、このように使用するようには設計されていません。プロンプトテキストは、テキストフィールドの左側に表示される短いラベル(TLabeledEditに似ています)を意味します。試行しているように、プロンプトの上に指示を表示するようには設計されていません。この状況は、必要なコントロールやレイアウトを使用して独自のカスタムフォームを作成するだけで、はるかに優れた処理が可能になります。例えば、言われて、InputQuery()は、カスタムVCL TFormを使用して実装されているので、あなたが何であるかを達成するために技術的に可能であること、しかし

など、繰り返しを示すために

を日付と時刻のTDateTimePickerTCheckBoxまたは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; 

image

:たとえば

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がどのように動作するかではありません

image