محدود کردن کاربر به وارد کردن عدد ( نه حروف) در Edit در دلفی

Sampro

Member
سلام دوستان.
یک کد نوشتم که باید یه مقدار عددی رو از یک ادیت بگیره .
ولی ممکنه کاربر یه مقدار رشته ای وارد کنه.
می خوام خودم به کاربر پیغام بدم و برنامه اررور نده . این کدیه که من به فکرم رسیده :
کد:
  try
    StrToInt(edtFileNumber.Text);
  except on EConvertError do
    begin
      MessageDlg(strMessage,mtError,[mbOK],0);
      exit;
    end;
  end;
متاسفانه یه مشکلی که هست اینه که اگه مثلا من یه مقدار خالی یا مقدار حرفی داخل ادیت بزارم هم خود دلفی به هم اررور می ده و هم بعدش خود پیغامی که من اونجا تو کد گذاشتم .

نمی دونم مشکل از کجاست . کسی راه حلشو می دونه .



در ضمن یه سوال دیگه : تابعی تو دلفی هست که بفهمه مثلا یه رشته قابلیت تبدیل به عدد رو داره یا نه مثل IsNumber سی شارپ؟
 

saalek110

Well-Known Member
در فایل exe شما همان می شود که می خواهید ولی در محیط کامپایلر همان می شود که فرمودید.
شاید تنظیماتی موجود است تا در کامپایلر هم شبیه حالت exe باشد ولی من اطلاع ندارم.
کلا try و except بعد تولید محصول(فایل exe ) عمل می کند.

راجع به سئوال دومتان من برخورد نداشتم.
تابعی با مقداری تغییر از این سایت:
http://www.howtodothings.com/computers/a1066-a-string-class-for-delphi.html
کد:
function IsNumber(str :string): Boolean;
var
  i: Integer;
begin
  Result := True;

  for i := 1 to Length(str) do

    if not (str[i] in ['0'..'9','.']) then

    begin
      Result := False;
      Exit;
    end;
end;
کد:
procedure TForm1.Button2Click(Sender: TObject);
begin
if  IsNumber(edit1.text) then showmessage('yes') else showmessage('no');
end;
 

farhad110

Member
یک کد نوشتم که باید یه مقدار عددی رو از یک ادیت بگیره .
ولی ممکنه کاربر یه مقدار رشته ای وارد کنه.
در ادامه صحبتهاي سالك عزيز براي مورد اول ميتونيد از شعار پيشگيري بهتر از درمان استفاده كنيد. كد زير رو در onchange كنترل ورودي متن بنويسيد:
کد:
if not (key in ['0'..'9']) then
  key:=#0;
براي اعداد اعشاري هم ميتونيد كاراكتر "." رو خودتون به كد اضافه كنيد.
 

Sampro

Member
ممنون سالک جان ولی می خواستم بدونم تابعی درونی برا ایم کار هست یا نه.

فرهاد جان این کدت کار نمی کنه . نوع key از نوع word هستش بنابراین char نمی پذیره.
اگه این کد درست بشه خیلی خوب می شه .


در ضمن نظرتون با ماسک ادیت چیه؟
ازش استفاده کردم فقط مشکلش اینه که کاربر با کلیک داخلش باید اول چند بار کلید لفت رو بزنه تا به اول ادیت بره و ممکنه کاربری که با این برنامه کار می کنه خبر نداشته باشه . برا این راه حلی دارین؟

ممنون
 

farhad110

Member
فرهاد جان این کدت کار نمی کنه . نوع key از نوع word هستش بنابراین char نمی پذیره.
اگه این کد درست بشه خیلی خوب می شه .
عذر خواهي! چون اينجا توي فروم تند تند مي نويسم بعضي وقتها از اين اشتباهات پيش مياد. كد رو در OnKeyPress بنويسيد. ضمنا #8 رو هم به كد اضافه كنيد (براي كليد backspace)
 

Sampro

Member
ممنون سالک جان.
در مورد این لینکی که گفتی یه فکرایی به ذهنم رسید که نمی دونم درست فکر کردم یا نه

می خوام بدونم یعنی اگه مثلا من اینو به دلفی اضافه کنم (نمی دونم چه طوری , اسمشو می زارم اضافه کردن) یعنی مثل سی شاپ می تونم بعد از نوشتن نام یه متغیر رشته ای با زدن نقطه بعد از متغیر فهرست دستورات باز بشه و از اونجا مثلا من بتونم تابع isNumber رو فراخوانی کنم . یا اینکه من اشتباه فکرکردم ؟ اگه درست فکر می کنم این کد ها رو چه طوری باید نصب کنم.

ممنون می شم اگه بگید .

در ضمن فرهاد جان من همون اول رفتم و تو رخداد OnKeyPress ریختمش ولی اونجا خطا می ده که از نوع دیورد باید انتخاب کنید نه از نوع چر . در ضمن فکر کن یه کاربر یه مقدار رو یک دفعه ای تو این ادیته بریزه اون وقت برنامه هیچی نمی فهمه . نتیجه اینکه فکر کنم همون دست آخر کلکشو بکنیم بهتره . چاره ی دیگه ای نیست .:sad:

ممنون دوستان
 
آخرین ویرایش:

saalek110

Well-Known Member
در مورد سئوال دوم البته آقا فرهاد جواب خواهند داد ولی تمام مباحثی که شما عنوان کردید در این تاپیک:

محدود کردن کاربر به وارد کردن عدد ( نه حروف) در TextBox در ویژوال بیسیک

بحث شده.
البته ویژوال بیسیک است ولی مفاهیم مثل رویدادهای مورد استفاده و کدهای پیش بینی شده مشابه است.

مثلا این بحث:
شما برای محدود کردن کاراکتر هایی که صفحه کلید در TextBox وارد می کند بایستی در داخل رخداد KeyPress و
Change، کاراکترهای غیر مجاز را فیلتر کنید.
اگر فقط اینکار را در KeyPress انجام دهید، کاربر می تواند از Copy و Paste برای انتقال کاراکتر های غیر مجاز استفاده کند.
اگر فقط اینکار را در Change انجام دهیم، کاراکترهای غیر مجاز ابتدا به متن اضافه می شوند و سپس دوباره حذف خواهند شد
که باعث پر پر زدن TextBox و جابجایی بی مورد مکان نما (Cursor) می شود.
یا این بحث:
تابع ()IsNumeric بررسی می کنه که آیا پارامتر ورودی (از هر نوعی یعنی Variant) قابلیت تبدیل به عدد را دارد یا نه.

این تابع هایی که شما مثال زدید مناسب نیستند، به یک دلیل مهم :

آنها فقط بررسی می کنند که مقداری قابلیت تبدیل به فلان نوع داده را دارد یا نه یا فلان حالت است یا نه،
اما نمی توانند مقدارش را در صورتی که شرط برقرار نبود فیلتر کنند تا شرط برقرار شود.
مثلا اگر "123ali" را به تابع IsNumeric بدهید می گوید که عدد نیست، اما نمی تواند "ali" را از آخر عبارت حذف کند تا
عدد بشود.
ولی ما به توابعی احتیاج داریم که در عبارت ورودی ما کاراکترهای غیر مجاز را حذف کند، نه اینکه فقط بگوید عبارت مجاز نیست.
 

farhad110

Member
در ضمن فرهاد جان من همون اول رفتم و تو رخداد OnKeyPress ریختمش ولی اونجا خطا می ده که از نوع دیورد باید انتخاب کنید نه از نوع چر .
مطمئنا شما در OnKeyDown نوشتيد نه در OnKeyPress !

در ضمن فکر کن یه کاربر یه مقدار رو یک دفعه ای تو این ادیته بریزه اون وقت برنامه هیچی نمی فهمه . نتیجه اینکه فکر کنم همون دست آخر کلکشو بکنیم بهتره . چاره ی دیگه ای نیست
درسته كاربر ميتونه متن رو copy , paste كنه كه اون موقع بايد در يك بلوك try..except خطا رو كنترل كنيد و يا از تابعي كه سالك عزيز در پست 2 نوشتند در lost focus استفاده كنيد و يا براي OnChange يك تابع بنويسيد
 
آخرین ویرایش:

Sampro

Member
مطمئنا من در کی پرس نوشتم ! (دلفیم 2006 شاید به این دلیل کار نکرده)
 

farhad110

Member
متاسفا نه من 2006 روي سيستم ندارم. اما شكل كلي توابع پر كاربرد نبايد تغييري كرده باشه:
کد:
[LEFT]    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure Edit1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);[/LEFT]

طبق تعاريف بالا key در يكي از نوع char و در ديگري word هست. تعاريف اين توابع در 2006 رو اينجا بگذاريد شايد بتونم كمك كنم
 

Sampro

Member
دوست من اشتباه از طرف من بود
این مسئله حل شد
همونیه که شما گفتین
جدا معذرت می خوام

ممنون.
 

magnus

New Member
سلام
دوست عزيز اين كد را در Onkeyprees وارد كن .
if ((Key<'0') and (Key>#31)) or (Key>'9') then
Key:= #0;

موفق باشي:wink:
 

جدیدترین ارسال ها

بالا