منع المكون TEdit قبول الحروف!
#11
لجعل الكتابة تتوصطها |--> (ES_CENTER)
PHP كود :
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)
PHP كود :
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)
PHP كود :
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; 
الرد
#12
شكرا لك على الموضوع


سؤال

هل نطبق نفس الطريقة على DBEdit
الرد
#13
إقتباس :سؤال

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

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

بالتوفيق,
فرّج همّ المهمومين يا الله
اللهم فك قيد اسرانا و اسرى المسلمين
الرد
#14
delphi4ever كتب :
كود :
begin if (key in ['0'..'9', #8]) then begin key := #0; beep; end; end;

السلام عليك يا أخي
حسب خبرتي البسيطة أظن ان في الكود الذي يطبع الأحرف ولا يطبع الأرقام
فيه خلل مع #8 حيث يجب عدم وضعها في هذا الكود لكي يقبل الحذف
وشكرا
أعرف شيء من كل شيء, وكل شيء من شيء
الرد
#15
السؤال الذي يطرح نفسه ماذا لو كان المستخدم اذكى من المبرمج ونسخ قيمة رقمية الى حافظة الويندوز ثم لصقها في هذا العنصر
طبعا لن تعمل الشيفرة لذلك هل من حل ؟
الرد
#16
إقتباس :لذلك هل من حل ؟
لكل مشكل حل
في هذه الحالة عليك باقتناص أثر الحدث WM_COPY
كود :
procedure WMCopy(var Message: TMessage); message WM_COPY;
ثم التصرف حيال ذلك...
مقالات ومواضيع في المنتدى كثيرة حول رسائل الأحداث في Windows
استخدم البحث...
الرد
#17
اخي العزيز 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;
الرد
#18
الشيفرة السابقة تحتاج الى تعديل
اليكم التعديل الجديد
كود :
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;
الرد
#19
استخدم الوسم code لتبدو الأكواد أوضح
مثال بطريقة أخرى من خلال قراءة محتوى Clipboard
PHP كود :
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 وأمثالها وبعض الفحوصات...
الرد
#20
[dcc32 Erreur] Unit2.pas(29): E2003 Identificateur non déclaré : 'DecimalSeparator'
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم