المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : منع المكون TEdit قبول الحروف!


delphi4ever
05-02-2008, 08:01 AM
السلام عليكم ورحمة الله
هذا مثال في دلفي عن منع المكون TEdit في دلفي من قبول الحروف وإجباره على قبول الأرقام فقط.;)
مثال:
1- نضع مكون TEdit في فورم (Form)
2- نذهب بعدها إلى الأحداث (Event) وبالخصوص إلى "OnKeyPress"
3- نضغط مرتين على الحدث من الجهة اليمنى ونكتب الكود (Code) التالي يعد Begin مباشرة:[/COLOR]
begin
if not (Key in ['0'..'9', #8]) then
begin
Key := #0;
Beep;
end;
end;
ولعمل عكس هذا، أي إجبار المكون TEdit قبول الحروف والرموز الأخرى فقط وعدم قبول الأرقام نقوم بما يلي:
- نتبع نفس الخطوات الأولى لكن هذه المرة نقوم بتغيير كلمة واحدة فقط في الكود وهي: Not
يصبح الكود كالتالي:
begin
if (Key in ['0'..'9', #8]) then
begin
Key := #0;
Beep;
end;
end;
وبالتوفــــــيق للجميع ...

metal
13-02-2008, 02:20 PM
ماذا يعني #8 ؟

B.M.AbdelAziZ
13-02-2008, 06:45 PM
بسم الله الرحمن الرحيم
ماذا يعني #8 ؟
المفتاح رقم 8 من لوحة المفاتيح Keyboard
وهو المفتاح DEL للحذف يسارا
والسلام عليكم ورحمة الله

metal
14-02-2008, 07:43 AM
ممتاز, اذا استطيع جعلها تدعم الفاصلة ايضا:

begin
if not (Key in ['0'..'9', #8, '.']) then
begin
Key := #0;
Beep;
end;
end;

merouane
22-02-2008, 10:41 PM
السلام عليكم

ممتاز, اذا استطيع جعلها تدعم الفاصلة ايضا:


من الأحسن ان يكون كالآتي

if not (Key in ['0'..'9', #8, DecimalSeparator]) then
begin
Key := #0;
Beep;
end;

الحكمة من ذلك هو أنك لا تعلم هل '.' أم ',' هي المستعملة من طرف النظام كتعبير عن الفاصلة

تحياتي :)

Free_M
06-12-2008, 02:08 PM
بهذه الافكار الجميلة وقراءت كل الاحتمالات تجعل الكود صغير و فعال
الله يبارك فيك اخي delphi4ever
وصلت الفكرة

TheNapsterBoy
31-03-2009, 08:05 AM
بكل بساطة الكود يقوم بالبحث في مجموعة الحروف ['0'..'9', #8, DecimalSeparator] و التي تمثل الارقام و الفاصلة و كود زر DEL في حالة عدم وجود الزر في تلك المجموعة فانه لا يظهر الحرف على TEdit بتعويضه ب NULL = #0

Dr.MOT
31-03-2009, 11:13 AM
السلام عليكم
بارك الله فيك ,,
ما وظيفة الدآلة beeb ?
وشكرا مرة أخرىا

TheNapsterBoy
01-04-2009, 08:46 AM
الدالة beep تعطيك صوت في الوندوز يشير الى حدوث عملية ممنوعة
لاحظ انه يختلف عن الصوت الناتج عم خطأ في النظام بل يشبه نوها ما ضوت رمي ابرة :)

TF6M
01-04-2009, 01:43 PM
تحتاج دالة الـ Beep بارامتران (التوتر + زمن التنفيذ) ونجد هده الدالة في : KERNEL32.DLL فقط تستطيع أن تسدعيها

و ترى بنفسك أحسن !! .

hanipino
29-12-2009, 09:48 PM
لجعل الكتابة تتوصطها |--> (ES_CENTER)

procedure TForm1.btn1Click(Sender: TObject);
var
Style: LongInt;
begin
Style := GetWindowLong(edt1.Handle, GWL_STYLE);
SetWindowLong(edt1.Handle, GWL_STYLE, Style or ES_CENTER);
edt1.Invalidate;
end;


لجعلها تقبل الارقام فقط (الارقام دون فاصلة ... ?) |--> (ES_NUMBER)

procedure TForm1.btn1Click(Sender: TObject);
var
Style: LongInt;
begin
Style := GetWindowLong(edt1.Handle, GWL_STYLE);
SetWindowLong(edt1.Handle, GWL_STYLE, Style or ES_NUMBER);
edt1.Invalidate;
end;


لمزج كلى الحالتين |--> (ES_NUMBER or ES_CENTER)

procedure TForm1.btn1Click(Sender: TObject);
var
Style: LongInt;
begin
Style := GetWindowLong(edt1.Handle, GWL_STYLE);
SetWindowLong(edt1.Handle, GWL_STYLE, Style or ES_NUMBER or ES_CENTER);
edt1.Invalidate;
end;

sachaigor
06-02-2010, 12:46 PM
شكرا لك على الموضوع


سؤال

هل نطبق نفس الطريقة على DBEdit

AL-MOB4RM3G
06-02-2010, 01:08 PM
سؤال

هل نطبق نفس الطريقة على DBEdit

اخي الكريم, ال DBEdit يستخدم لجلب البيانات من قآعدة البيانات,
لذلك يمكنك استخدام مثلا ال TEdit عادي قبل تخزين المعلومة في القآعدة وبعدها تجلب المعلومة من القآعدة بستخدام ال DBEdit بدون مشآكل ان شاء الله,

بالتوفيق,

unusual
07-03-2011, 09:09 AM
begin
if (key in ['0'..'9', #8]) then
begin
key := #0;
beep;
end;
end;


السلام عليك يا أخي
حسب خبرتي البسيطة أظن ان في الكود الذي يطبع الأحرف ولا يطبع الأرقام
فيه خلل مع #8 حيث يجب عدم وضعها في هذا الكود لكي يقبل الحذف
وشكرا

syscall
07-03-2011, 06:18 PM
السؤال الذي يطرح نفسه ماذا لو كان المستخدم اذكى من المبرمج ونسخ قيمة رقمية الى حافظة الويندوز ثم لصقها في هذا العنصر
طبعا لن تعمل الشيفرة لذلك هل من حل ؟

kachwahed
07-03-2011, 06:24 PM
لذلك هل من حل ؟
لكل مشكل حل
في هذه الحالة عليك باقتناص أثر الحدث WM_COPY
procedure WMCopy(var Message: TMessage); message WM_COPY;
ثم التصرف حيال ذلك...
مقالات ومواضيع في المنتدى كثيرة حول رسائل الأحداث في Windows
استخدم البحث...

syscall
07-03-2011, 06:32 PM
اخي العزيز kachwahed اعلم ان هناك حل ولدي الحل بطريقتي الخاصة وبدون استخدام رسائل الاحداث
لكن اردت ان اعرف بعض التجارب الاخرى لدى الشباب
حتى لااطيل عليكم اليكم الحل
طبعا في هذا المثال يمكن ادخال قيمة رقمية ولكن من المستحيل ادخال قيمة حرفية

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

function isNum(Value: String): Boolean;
var
X: Integer;
begin
Result:=Value <> '';
IF Result Then
For X:=1 To Length(Value) Do
Case Value[X] OF
'0'..'9':;
Else
Result:=False;
Break;
End;
end;

procedure TForm1.Edit1Change(Sender: TObject);
var
edit: TEdit;
begin
edit:=TEdit(sender);
if isNum(edit.text) then
edit.ClearUndo
else
begin
edit.OnChange:=nil;
edit.Undo;
edit.OnChange:=Edit1Change;
edit.ClearUndo;
edit.SelectAll;
end;
end;

syscall
07-03-2011, 06:53 PM
الشيفرة السابقة تحتاج الى تعديل
اليكم التعديل الجديد

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

function isNum(Value: String): Boolean;
var
X: Integer;
begin
Result:=Value <> '';
IF Result Then
For X:=1 To Length(Value) Do
Case Value[X] OF
'0'..'9':;
Else
Result:=False;
Break;
End;
end;

procedure TForm1.Edit1Change(Sender: TObject);
var
edit: TEdit;
begin
edit:=TEdit(sender);

if edit.Text <> '' then
if not isNum(edit.text) then
begin
edit.OnChange:=nil;
edit.Undo;
edit.OnChange:=Edit1Change;
edit.SelectAll;
end;

edit.ClearUndo
end;

kachwahed
07-03-2011, 10:10 PM
استخدم الوسم code لتبدو الأكواد أوضح
مثال بطريقة أخرى من خلال قراءة محتوى Clipboard


uses
ClipBrd;

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
Mgs: TMsg;

procedure EatKey;
{ Clear Keyboardbuffer}
begin
PeekMessage(Mgs, 0, WM_CHAR, WM_CHAR, PM_REMOVE);
end;

begin
{ Check if control pressed }
if (ssCtrl in Shift) then
case key of
{ Ctrl + v }
86:
begin
{ determine if the Clipboard contains a string type }
if Clipboard.HasFormat(CF_TEXT) then
{ Check if text consists of numbers }
try
StrToInt(Clipboard.AsText);
except
{ If no then don't insert text }
EatKey
end;
end;
{ Ctrl + c }
67: { do nothing }
else
EatKey;
end
{ else check for allowed characters such as BackSpace, RETURN...}
else if not (Key in [8, 13, 110, 96..105]) then EatKey;
end;
المثال لـ Thomas Stutz بتصرف
ينقصه منع Shift+Insert وأمثالها وبعض الفحوصات...