PDA

View Full Version : Edit که فقط عدد بگیره .



bmanfy
سه شنبه 15 بهمن 1387, 18:55 عصر
سلام دوستان :
می خوام Editی داشته باشم که فقط بتونه عدد بگیره .
از MaskEdit میشه استفاده کرد اما خوب نمشیه به صورت پیشفرض بهش مقدار '' نسبت داد (شاید هم من بلد نیستم ).
به عبارتی همون اول کاری باید به یه مقدار خاص حالا هر چیزی پر باشه که این خوش آیند نیست.
و یک مشکل دیگه هم که داره باید طول میدان ثابت باشه که این برای اعداد اعشاری کمی ناخوشاینده و نمیتونم با اعداد اعشاری شناور رو بهش نسبت بدم .

تا حالا خودم در رویداد change تکسباکسها این مسئله رو چک میکردم . اما الان به دلیل برخی مسائل نمیتونم از این روش استفاده کنم ؟
کسی در این مورد .... ؟

accpascal
سه شنبه 15 بهمن 1387, 23:04 عصر
یک function به این صورت تعریف من

function trueint(key:char):boolean;
begin
if not (Key in ['0'..'9',#8,#9])and(key<>#27)and(key<>#13) then result:=false
else result:=true;
end;

حالا در رویداد onkeypress مربوط به هر edit دستور زیر را وارد کن

if not trueint(key) then raise Exception.Create('æÑæÏí ÕÍíÍ äíÓÊ');

accpascal
سه شنبه 15 بهمن 1387, 23:06 عصر
ببخشید دستور دوم درست ارسال نشد دستور در رویداد onkeypress
به این صورت می باشد

if not trueint(key) then raise Exception.Create('æÑæÏí ÕÍíÍ äíÓÊ');

Modernidea
چهارشنبه 16 بهمن 1387, 02:19 صبح
حرف accpascal كاملا درسته. اگر هم خواستي بدون تابع بنويسي به اين شكل است
تو رويداد KeyPress مينويسي:


if not (key in ['0'..'9']) And (key <> Chr(8)) And (key <> Chr(13)) And (key <> Chr(27)) then
;key:=#0

در اينجا من شرط گذاشتم كه اگر كليدهايي غير از 0 تا 9 و Backspace ،اينتر و Esc زده شده هيچ عملي انجام نشه.
موفق باشي.

vcldeveloper
چهارشنبه 16 بهمن 1387, 03:09 صبح
این سوال بارها جواب داده شده.


if not (key in ['0'..'9']) And (key <> Chr(8)) And (key <> Chr(13)) And (key <> Chr(27)) then
چرا برای هر کدوم از کلیدها یک شرط گذاشتید؟!

if not (key in ['0'..'9',#8,#13,#27]) then

در ضمن، قبلا هم گفتم که استفاده از این روش در دلفی 2009 باعث ایجاد Warning میشه، و باید از تابع CharInSet یا تابع IsDigit در یونیت Character استفاده کنید.

امید امرایی
چهارشنبه 16 بهمن 1387, 10:12 صبح
از TAdvEdit موجود در پکیج TMS استفاده و یک بار برای همیشه خودتون رو خلاص کنید

bmanfy
چهارشنبه 16 بهمن 1387, 10:13 صبح
ممنون از پاسخ همگی دوستان .
اما اگر توجه کنید گفتم که خودم قبلنا با استفاده از تابع برای change یک edit این امر رو کنترل میکردم .
اما در حال حاضر میخوام بدون استفاده از تابع .
بذارید بگم قصد من چیه :
من قصد دارم کلیه اشیا رو در زمان اجرای برنامه طراحی کنم . یعنی عملا در زمان طراحی چیزی روی فرم قرار نمیدم که بخواهم براش کد ی بنویسم . (باید اشیا در زمان اجرا تولید بشه بنا به یه دلیل خاص)
که خوب در زمان اجرا نمیشه من برای رویداد Edit کد بنویسم ؟ درسته ؟

اما با MaskEdit میشه این کار رو کرد اما مشکلات خاص خودش رو داره . که در بالا گفتم .
مثلا یه کامپوننت سراغ ندارید که تنها عدد بگیره ؟

البته یه سوال تو بخش کامپوننتها بیان کردم . (که چه طوری یه کامپوننت جدید از Edit بسازم که رویداد Key... اون کد نویسی شده باشه!؟)

bmanfy
چهارشنبه 16 بهمن 1387, 10:29 صبح
از TAdvEdit موجود در پکیج TMS استفاده و یک بار برای همیشه خودتون رو خلاص کنید


ظاهرا وقتی شما این پست رو زدین من در حال نوشتن پست قبلی بودم .
دقیقا خواسته ی من هم همین هست . میشه شفاف تر بگید ؟
این پکیج TMS چه جوریاست از کجا بیارمش ؟

vcldeveloper
چهارشنبه 16 بهمن 1387, 17:06 عصر
خوب در زمان اجرا نمیشه من برای رویداد Edit کد بنویسم ؟ درسته ؟
خیر درست نیست.

Mask
پنج شنبه 17 بهمن 1387, 08:44 صبح
برای اینکه Edit فقط عدد بگیره ابتدا دستور زیر رو بنویس

function SetWindowLongEx(handle: HWND;gwl_type, new_long: Integer): Boolean;
var
w_style: Integer;
begin
Result := False;
w_style := GetWindowLong(handle, gwl_type);
if w_style = 0 then Exit;
w_style := w_style + new_long;
Result := SetWindowLong(handle, gwl_type, w_style) > 0;
end;


بعد دستور زیر را در FormCreate بنویس

SetWindowLongEx(Edit1.Handle, GWL_STYLE, +ES_NUMBER);

و اگه بخوای فقط حرف قبول کنه دستور زیر را در KeyPress همانEdit بنویس

if not (Key in ['a'..'z', '!', '#']) then
Key := #0;

این هم نمونه برنامه اش انشاء الله کمکتون بکنه
http://www.iranianupload.com//uploads/project1.zip

bmanfy
شنبه 19 بهمن 1387, 18:46 عصر
خیر درست نیست.
ضمن تشکر از شما :
امد طبق بررسی هایی که انجام به این نتیجه رسیدم که میشه در زمان اجرا هم یک شی ساخت و رویدادهای اون شی رو برنامه نویسی کرد .
فقط کافیه در زمان طراحی ما یک نومنه اولیه از شی مورد نظرمون بسازیم و رویدادهای مورد نظرمون رو برنامه نویسی بکنیم . فقط در ابتدا ممکنه یک مقدار از بعضی دوستان انعطاف پذیری اون کم باشه . اما با بهره گیری از تووابع کمکی میشه انعطاف پذیرش کرد .
و چون این شی به عنوان یک نمونه است و نیازی نیست در زمان اجرار دیده بشه میتونیم اون رو نمایش هم ندیم .
مثلا اینجا برای همون سوالی که دارم . یه Edit که فقط عدد بگیره . پس در رویداد مورد نظر (KeyPress) کد مربوطه رو مینویسیم . با فرض بر اینکه نام شی EdtSaple است .



procedure TForm1.EdtSampleKeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ['0' .. '9' , #8 , #9 , #13 , #27]) then
Key := #0 ;
end;




خوب حالا نوبت به ساختن شی مورد نظر هست . شی رو میسازیم و یک متغییر از نوع
TKeyPressEvent تعریف میکنیم . بعد هم درون این متغییر مقدار رویداد KeyPress مربوط به EdtSample رو میریزیم و سپس به ریداد Edit ساخته شده نسبت میدیم . البته میتونیم مستقیما هم انتساب بدیم .


edit := TEdit.Create(self);
edit.Parent := Form1 ;
Edit.OnKeyPress := EdtSample.OnKeyPress ;