문제

를 얻고 싶은 여러 다른 형태 값(시간,압력,이름,...)사용자.과용으로 맞춤설정하고 싶 inputbox.그러나 그것은 하나의 값이 있습니다.

어떤 방법으로 이 상황을 해결하기 위해,또는 어떤 요소를 사용합니까?

도움이 되었습니까?

해결책

François가 옳습니다. 당신은 당신이 주신 도구의 한계에 도달했습니다. InputBox 단순히 복잡한 입력을 위해 설계되지 않았으며 여러 값을 처리하도록 확장되지 않도록 설계되지 않았습니다.

링크 한 페이지 귀하의 의견에는 예가 예를 가지고 있지만 다소 제시되지 않으므로 오해에 대해 비난하지 않습니다. 나도 몇 가지 독서가 필요했습니다. 그 핵심은 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;

그건 끔찍한 그러나 사용자를위한 인터페이스. 돌아갈 수있는 방법이없고, 취소 할 방법이없고, 심문이 얼마나 오래 지속될 것인지 징후가 없으며 특정 데이터 유형에 대한 형식을 시행 할 방법이 없습니다. 필요한 정보를 정확히 얻는 사용자 정의 양식을 설계하면 실제로 훨씬 나을 것입니다. 세계에서 가장 쉬운 방법에 대한 양식을 디자인하는 도구를 사용하고 있습니다. 그것을 저항하지 마십시오.

시간, 압력 및 이름을 얻어야한다면 세 가지 입력 컨트롤이있는 양식을 만드십시오. a TDateTimePicker 당분간, a TSpinEdit 숫자 입력의 경우 a 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 방법. 이를 통해 사용자가 양식을 닫으려면 OK를 누르거나 취소했는지 여부를 알려줍니다. 당신은 그렇게 할 수 없습니다 InputBox, 항상 문자열을 반환합니다. (InputQuery 이 두 기능 사이의 주요 차이점 인 정보를 말할 수 있지만, 단독만으로도 귀하의 상황에서 사용 가치가있는 기능은 아닙니다.)

이 새로운 양식 클래스가 프로젝트의 무게를 측정하는 것에 대해 걱정하지 마십시오. 프로젝트 규모에 가장 큰 영향을 미치는 두 가지는 다음과 같습니다. sysutils 그리고 형태 단위. 당신은 이미 그것들을 포함 시켰으므로 최악의 상황은 이미 과거입니다. 이미 하나 이상의 양식을 가지고있는 프로젝트에 양식을 추가해도 프로젝트 크기에 전혀 영향을 미치지 않습니다. 특히 위에서 설명한 양식이 아닌 8 개의 컨트롤 만 있습니다.

다른 팁

"Inputbox" - Tedit이 정확히 무엇을 의미합니까? 입력을위한 다양한 종류의 구성 요소가 있으며, 이는 여러 가지를 수행 할 수 있습니다. 이름의 경우 Tedit은 매우 좋습니다. 그러나 시간이 지남에 따라 캘린더 제어를 원할 수도 있고 압력을 위해 숫자에 좋은 컨트롤을 사용할 수 있습니다.

예, 양식을 디자인하십시오!

Dialogs.inputbox는 사용자로부터 1 문자열을 빠르고 간단하게 가져 오도록 설계되었습니다.
더 원한다면 항목 양식을 설계해야합니다.
기본 대화 상자를 원한다면 Dialogs.inputQuery에서 코드를보고 자신의 절차를 코딩하는 시작점으로 사용할 수 있습니다.

실제 거래를 원한다면 실제 형태를 파고 코딩해야합니다.

Rob 's Kennedy는 맞습니다. 입력 상자는 좋은 옵션이 아닙니다 ... 정확히 무엇을 저장하려고합니까? exe 공간, ressources 또는 소스 코드? 아니면 "녹색"코드로 환경을 저장하고 싶습니까?

입력 쿼리 함수를 살펴보면 그것이하는 일이 tform을 만들고 somes 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 방법을 채울에서 대화를 기록하거나 클래스를 보유하는 값에서 사용되는 루틴입니다.나지 않을 조작하려고 컨트롤 양식에서 외부에서 형태지만,대신 루틴을 작성하여 그것을 형태로 자체입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top