هل هناك أي طريقة لاستخدام صندوق إدخال دلفي مع قيم متعددة؟

StackOverflow https://stackoverflow.com/questions/1879427

  •  18-09-2019
  •  | 
  •  

سؤال

أريد الحصول على قيم أنواع مختلفة متعددة (الوقت، الضغط، الاسم، ...) من المستخدم.وأريد تخصيص صندوق الإدخال الخاص بي.ولكنها تأخذ قيمة واحدة فقط.

هل هناك أي طريقة لحل هذا الموقف، أو أي مكون لاستخدامه؟

هل كانت مفيدة؟

المحلول

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;

هذا كريه واجهة للمستخدم، على الرغم من. لا توجد طريقة للعودة، لا توجد طريقة للإلغاء، ليس هناك أي إشارة إلى المدة التي ستستمر الاستجواب، ولا توجد طريقة لفرض صيغ لأنواع معينة من البيانات. ستكون حقا أفضل حالا إذا قمت بتصميم نموذج مخصص يحصل على المعلومات التي تحتاجها بالضبط. أنت تستخدم أداة تجعل تصميم نموذج حول أسهل شيء في العالم. لا تقاوم ذلك.

إذا كنت بحاجة إلى الحصول على الوقت والضغط والاسم، فقم بإجراء نموذج مع ثلاثة عناصر تحكم الإدخال. إستخدم 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 جيد جدا - ولكن بالنسبة للوقت، قد ترغب في التحكم في التقويم، وللضغط قد ترغب في استخدام عنصر تحكم يبدو رائعا للأرقام.

نعم، تصميم نموذج!

تم تصميم Dialogs.inputox للحصول على سلسلة واحدة من المستخدم، سريعة وبسيطة.
إذا كنت تريد المزيد، يجب عليك تصميم نموذج إدخال.
إذا كنت تريد مربع حوار أساسي، فيمكنك إلقاء نظرة على التعليمات البرمجية في DialTogs.inputquery، واستخدامها كأداة بداية لرمز الإجراء الخاص بك.

إذا كنت تريد الصفقة الحقيقية، فعليك حفرها وكود نموذج حقيقي.

روب كينيدي هو الصحيح .. مربع الإدخال ليس خيارا جيدا ... ما الذي تحاول حفظه بالضبط؟ EXE Space أو Ressources أو شفرة المصدر؟ أو تريد فقط حفظ البيئة مع رمز "الأخضر" الخاص بك؟

إذا تلقيت نظرة على الوظيفة المدخنة، فسترى أن ما تفعله هو إنشاء TFORM وإنشاء Somes Tbuttons / TLABLES / 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