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