PDA

View Full Version : خبر: مشکل در KeyPress



Delphi 2010
چهارشنبه 20 شهریور 1392, 13:49 عصر
بنده امروز کدی داشتم می نوشتم در OnKeyPress یه ادیت که به پیغام جدیدی برخورد کردم

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

موقعی که کد زیر رو


if Key in ['a'..'z'] + ['A'..'Z'] then Key := #0

در OnKeyPress می نوشتم برنامه خطایی نمی داد و در Log Compile برنامه پیغام


Consider using 'CharInSet' function in 'SysUtils' unit

رو میداد.

بعد از مدتی پیگیری فهمیدم که تابعی به نام CharInSet اضافه شده و باید از اون استفاده کنیم تا خطایی به ما نمایش داده نشه


if not CharInSet(Key,['a'..'z','A'..'Z','0'..'9', '!', '#']) then
Key := #0;
تا دلفی 7 مشکلی با کل اول نداشتم ولی تو دلفی XE به بعد اضافه شده این تابع

البته بگم خدمتتون با پیغامی که خود دلفی می داد باید متوجه می شدم ولی از بی سوادی بنده هستش و لطفا........

یوسف زالی
چهارشنبه 20 شهریور 1392, 15:23 عصر
این هم ارور می داد؟


if Key in ['a'..'z', 'A'..'Z'] then Key := #0

Delphi 2010
چهارشنبه 20 شهریور 1392, 15:30 عصر
عزیزم ممکنه من مفهوم رو درست نرسونده باشم

این کد درست هستش


if not CharInSet(Key,['a'..'z','A'..'Z','0'..'9', '!', '#']) then
Key := #0;

یوسف زالی
چهارشنبه 20 شهریور 1392, 15:53 عصر
منظور من اینه که در کد بالا ممکنه دلفی سر + کردن دو مجموعه خنگ بازی در آورده باشه و باید جاش از روش پست دو استفاده بشه.
به این دلیل می گم که در کامپوننت ها و کدهام همیشه درگیر چنین مطالبی هستم ولی تا به حال از روش + استفاده نکرده بودم. ارور دادنش برام عجیبه.
در ضمن طی بررسی های من CharInSet در حدود 4 برابر هم کند تره.

Delphi 2010
چهارشنبه 20 شهریور 1392, 15:56 عصر
ببخشید مطلبتون واضح نبود و + چی هست تو جملاتتون؟

یوسف زالی
چهارشنبه 20 شهریور 1392, 16:00 عصر
شما گفتی:


if Key in ['a'..'z'] + ['A'..'Z'] then Key := #0

ارور می داد.
من می گم:
1- دلیل ارور دادن این کد خیلی عجیبه برام
2- چرا اصلا از + در کد استفاده شده در صورتی که می شد این طور نوشت:


if Key in ['a'..'z', 'A'..'Z'] then Key := #0

3- استفاده از تابعی که معرفی کردید، طبق جستجو های من در حدود 4 برابر کند تر عمل می کنه.
4- ممکنه با این اصلاحیه برنامه درست کار کنه و مشکل از اولویت باشه:


if Key in (['a'..'z'] + ['A'..'Z']) then Key := #0

Delphi 2010
چهارشنبه 20 شهریور 1392, 16:03 عصر
ممنون از تحقیقتون
به هر حال فرقی نمی کرد که از + چه از , استفاده بکنیم توی کد باز هم خطا داشت

به نظرتون چطوری میشه فهمید علت این خطا چیه؟

از دوستان عزیز کسی بررسی نکرده این مشکل رو؟

یوسف زالی
چهارشنبه 20 شهریور 1392, 16:08 عصر
در این 7 8 سالی که درگیر دلفیم، تا به حال اروری مشاهده نکردم.
البته با ورژن های بدون یونیکد!
بنا بر این نظرم بر اینه که دلفی نسخ بالاتر، بین ثابت های کاراکتری و متغیر هاش، بنا به دلایلی تفاوت های داخلی قائله و این دستور این تفاوت ها رو در نظر می گیره.
از همین رو هم کامپایلر مقایسه رو متوجه می شه و این تابع رو پیشنهاد می کنه.
البته هنوز هیچ کدی نزدم و نظری تئوری دادم :)

Delphi 2010
پنج شنبه 21 شهریور 1392, 10:27 صبح
ببخشید

بررسی کردید دقیقا مشکل از کجا میتونه باشه

Felony
پنج شنبه 21 شهریور 1392, 12:11 عصر
در OnKeyPress می نوشتم برنامه خطایی نمی داد و در Log Compile برنامه پیغام
خوب حالا مشکل چی هست ؟ اون داره به شما یاداوری میکنه که کدنویسیت رو عوض کنی و فسیل کد نزنی ؛ همین ، حالا دوست داشتی بزنی هم مشکلی پیش نمیاد چون اصولا Backward Compatibility کدها در نسخ مختلف کامپایلر مد نظر قرار میگیره ، ولی خب کاره دیگه ، یهو دیدی 4 سال دیگه کدت رو فلان نسخه دلفی کامپایل نشد ، پس همیشه به این هشدارها تا جایی که امکانش هست گوش کنید و رفعشون کنید .


در ضمن طی بررسی های من CharInSet در حدود 4 برابر هم کند تره.
بستگی به محل استفاده داره ، جدیدا همه گیر دادن به Performance کدها ، باید مورد استفاده کد رو هم مد نظر قرار داد تو یک برنامه که UI داره و کاربر داره باهاش کار میکنه و تو رویداد OnkeyPress داره کارهایی انجام میده 10 میلی ثانیه با 40 میلی ثانیه تفاوتی نمیکنه ، Performance بسته به شرایط و کاربرد تغییر پیدا میکنه و یک روند ثابت نداره .

Delphi 2010
پنج شنبه 21 شهریور 1392, 18:50 عصر
حرف شما درسته
از شرکت ها همه چیز بر میاد

مثلا بین کدهای زیر هم تفاوت قائل شده دوباره و هشدار میده


Edit.Free
FreeAndNil(Edit)