Debug Ace
عضو جديد 01-
Posts
14 -
تاريخ الانضمام
-
تاريخ اخر زياره
السمعه بالموقع
8 Neutralعن العضو Debug Ace

البيانات الشخصية
-
Gender (Ar)
ذكر
-
Job Title
DebugAce
اخر الزوار
بلوك اخر الزوار معطل ولن يظهر للاعضاء
-
omarahmed1443 started following Debug Ace
-
ممتاز جدا جدا وانا قمت بتجربة كود جلب الخطوط العربية فقط من النظام وسوف ادمج بينه وبين طريقتى لتمكين المطور او المستخدم من تحديد خطوط معينه ان اراد ذلك فى المستقبل وهذا الكود المنقح Option Compare Database Option Explicit '=== تعريف LOGFONT === Private Type LOGFONT lfHeight As Long lfWidth As Long lfEscapement As Long lfOrientation As Long lfWeight As Long lfItalic As Byte lfUnderline As Byte lfStrikeOut As Byte lfCharSet As Byte lfOutPrecision As Byte lfClipPrecision As Byte lfQuality As Byte lfPitchAndFamily As Byte lfFaceName(0 To 31) As Byte End Type Private Const ARABIC_CHARSET As Byte = 178 Private Const DEFAULT_CHARSET As Byte = 1 '=== الـ API Declarations === #If VBA7 Then Private Declare PtrSafe Function GetDC Lib "user32" (ByVal hWnd As LongPtr) As LongPtr Private Declare PtrSafe Function ReleaseDC Lib "user32" (ByVal hWnd As LongPtr, ByVal hdc As LongPtr) As Long Private Declare PtrSafe Function EnumFontFamiliesEx Lib "gdi32" Alias "EnumFontFamiliesExA" _ (ByVal hdc As LongPtr, lpLogFont As LOGFONT, ByVal lpEnumFontProc As LongPtr, _ ByVal lParam As LongPtr, ByVal dwFlags As Long) As Long #Else Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long Private Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hDC As Long) As Long Private Declare Function EnumFontFamiliesEx Lib "gdi32" Alias "EnumFontFamiliesExA" _ (ByVal hdc As Long, lpLogFont As LOGFONT, ByVal lpEnumFontProc As Long, _ ByVal lParam As Long, ByVal dwFlags As Long) As Long #End If Private m_FontList As Collection '=== الدالة الرئيسية === Public Sub LoadArabicFonts(cbo As Control, Optional IncludeNonArabic As Boolean = False) On Error GoTo ErrorHandler ' التحقق من صحة الـ Control If cbo Is Nothing Then Err.Raise 91, , "Control غير صالح" ' تهيئة القائمة بأمان SafeClearCombo cbo cbo.RowSourceType = "Value List" ' تحميل الخطوط Set m_FontList = New Collection If LoadSystemArabicFonts(IncludeNonArabic) Then PopulateComboBox cbo Else SafeAddItem cbo, "خطوط غير متوفرة" End If Exit Sub ErrorHandler: SafeClearCombo cbo SafeAddItem cbo, "خطأ في تحميل الخطوط" Debug.Print "LoadArabicFonts Error: " & Err.Number & " - " & Err.Description End Sub '=== وظائف مساعدة آمنة === Private Sub SafeClearCombo(cbo As Control) On Error Resume Next cbo.Clear On Error GoTo 0 End Sub Private Sub SafeAddItem(cbo As Control, itemText As String) On Error Resume Next cbo.AddItem itemText On Error GoTo 0 End Sub '=== تحميل الخطوط من النظام === Private Function LoadSystemArabicFonts(IncludeNonArabic As Boolean) As Boolean Dim hdc As LongPtr Dim lf As LOGFONT ' إعداد LOGFONT للخطوط العربية lf.lfCharSet = IIf(IncludeNonArabic, DEFAULT_CHARSET, ARABIC_CHARSET) ' الحصول على Device Context #If VBA7 Then hdc = GetDC(0) #Else hdc = GetDC(0&) #End If If hdc = 0 Then Exit Function On Error GoTo Cleanup EnumFontFamiliesEx hdc, lf, AddressOf EnumFontProc, 0, 0 Cleanup: LoadSystemArabicFonts = (m_FontList.Count > 0) #If VBA7 Then ReleaseDC 0, hdc #Else ReleaseDC 0&, hdc #End If On Error GoTo 0 End Function '=== Callback للخطوط === #If VBA7 Then Private Function EnumFontProc(lpelf As LOGFONT, ByVal lpntm As LongPtr, _ ByVal FontType As Long, ByVal lParam As LongPtr) As Long #Else Private Function EnumFontProc(lpelf As LOGFONT, ByVal lpntm As Long, _ ByVal FontType As Long, ByVal lParam As Long) As Long #End If On Error Resume Next Dim fName As String fName = StrConv(lpelf.lfFaceName, vbUnicode) fName = Left$(fName, InStr(fName, ChrW(0)) - 1) fName = Trim$(fName) ' فلتر TrueType فقط + تجنب التكرار If Len(fName) > 2 And (FontType And 4) = 4 And Not FontExists(fName) Then m_FontList.Add fName, fName ' Debug.Print "Font added: " & fName ' للاختبار End If EnumFontProc = 1 End Function '=== فحص وجود الخط === Private Function FontExists(fontName As String) As Boolean Dim f As Variant On Error Resume Next Set f = m_FontList(fontName) FontExists = (Err.Number = 0) On Error GoTo 0 End Function '=== ملء القائمة مع الترتيب === Private Sub PopulateComboBox(cbo As Control) Dim arr() As String Dim i As Long If m_FontList.Count = 0 Then Exit Sub ' تحويل Collection إلى Array ReDim arr(1 To m_FontList.Count) For i = 1 To m_FontList.Count arr(i) = m_FontList(i) Next i ' ترتيب سريع QuickSort arr, LBound(arr), UBound(arr) ' إضافة للـ ComboBox For i = LBound(arr) To UBound(arr) cbo.AddItem arr(i) Next i End Sub '=== Sort === Private Sub QuickSort(arr() As String, ByVal low As Long, ByVal high As Long) Dim pivot As String, i As Long, j As Long, temp As String If low < high Then pivot = arr((low + high) \ 2) i = low: j = high Do While StrComp(arr(i), pivot, vbTextCompare) < 0: i = i + 1: Wend While StrComp(arr(j), pivot, vbTextCompare) > 0: j = j - 1: Wend If i <= j Then temp = arr(i): arr(i) = arr(j): arr(j) = temp i = i + 1: j = j - 1 End If Loop While i <= j If low < j Then QuickSort arr, low, j If i < high Then QuickSort arr, i, high End If End Sub '=== وظيفة اختبار === Public Function GetArabicFontsCount() As Long Set m_FontList = New Collection LoadSystemArabicFonts False GetArabicFontsCount = m_FontList.Count End Function
-
وبذلك التعديل يصبح الكود فى النهاية بهذا الشكل '=== ÇáËæÇÈÊ ááæÑÏíÉ ÇáãÓÇÆíÉ === Private Const SHIFT_START_HOUR As Integer = 17 ' 5 ãÓÇÁ Private Const SHIFT_END_HOUR As Integer = 1 ' 1 ÕÈÇÍÇ Private Const DEFAULT_WORK_HOURS As Long = 8 Private Const DEFAULT_FREE_IN_MINS As Long = 30 Private Const DEFAULT_FREE_OUT_MINS As Long = 30 '=== 1. ÝÍÕ ãÇ ÅÐÇ ßÇä ÇáæÞÊ ÇáãÍÏÏ Öãä æÑÏíÉ ãÓÇÆíÉ === Public Function IsEveningShiftNow(Optional ByVal checkTime As Date = 0) As Boolean If checkTime = 0 Then checkTime = Time() IsEveningShiftNow = (checkTime >= TimeSerial(SHIFT_START_HOUR, 0, 0)) Or (checkTime < TimeSerial(SHIFT_END_HOUR, 0, 0)) End Function '=== 2. ÊÇÑíÎ ÇáæÑÏíÉ ÇáÍÇáíÉ === Public Function CurrentShiftDate(Optional ByVal currentTime As Date = 0) As Date If currentTime = 0 Then currentTime = Time() If IsEveningShiftNow(currentTime) Then If currentTime >= TimeSerial(SHIFT_START_HOUR, 0, 0) Then CurrentShiftDate = Date Else CurrentShiftDate = Date - 1 End If Else CurrentShiftDate = Date End If End Function '=== 3. ÞÑÇÁÉ ÅÚÏÇÏÇÊ ÇáæÑÏíÉ ãÑÉ æÇÍÏÉ === Private Function GetShiftSettings() As Variant Static cachedSettings As Variant Static lastCacheTime As Date If DateDiff("n", lastCacheTime, Now()) > 5 Then Dim rst As DAO.Recordset Set rst = CurrentDb.OpenRecordset("SELECT fatrah2_In, hours_Work2, free2_in, free2_out FROM tblTimeCtrl WHERE 1=1") If Not rst.EOF Then cachedSettings = Array( _ Nz(rst!fatrah2_In, "17:00:00"), _ Nz(rst!hours_Work2, DEFAULT_WORK_HOURS), _ Nz(rst!free2_in, DEFAULT_FREE_IN_MINS), _ Nz(rst!free2_out, DEFAULT_FREE_OUT_MINS) _ ) Else cachedSettings = Array("17:00:00", DEFAULT_WORK_HOURS, DEFAULT_FREE_IN_MINS, DEFAULT_FREE_OUT_MINS) End If rst.Close: Set rst = Nothing lastCacheTime = Now() End If GetShiftSettings = cachedSettings End Function '=== 4. æÞÊ ÈÏÇíÉ ÇáÊÓÌíá ÇáãÓãæÍ (ÞÈá ÇáÏÎæá ÇáÑÓãí) === Public Function funFirstTimeB_In(Optional ByVal refTime As Date = 0) As Date Dim settings As Variant: settings = GetShiftSettings() Dim officialIn As Date: officialIn = TimeValue(settings(0)) Dim freeMins As Long: freeMins = CLng(settings(2)) If refTime = 0 Then refTime = Time() Dim shiftDate As Date: shiftDate = CurrentShiftDate(refTime) funFirstTimeB_In = DateAdd("n", -freeMins, shiftDate + officialIn) End Function '=== 5. æÞÊ äåÇíÉ ÇáÊÓÌíá ÇáãÓãæÍ (ÈÚÏ ÇáÇäÕÑÇÝ ÇáÑÓãí) === Public Function funLastTimeB_Out(Optional ByVal refTime As Date = 0) As Date Dim settings As Variant: settings = GetShiftSettings() Dim officialIn As Date: officialIn = TimeValue(settings(0)) Dim workHours As Long: workHours = CLng(settings(1)) Dim extraMins As Long: extraMins = CLng(settings(3)) If refTime = 0 Then refTime = Time() Dim shiftDate As Date: shiftDate = CurrentShiftDate(refTime) funLastTimeB_Out = DateAdd("n", (workHours * 60) + extraMins, shiftDate + officialIn) End Function '=== 6. æÙÇÆÝ ÅÖÇÝíÉ ááÊÍÞÞ æÇáÇÎÊÈÇÑ ãÚ ãÚÇãá æÞÊ === Public Function GetCurrentShiftInfo(Optional ByVal refTime As Date = 0) As String Dim shiftDate As Date: shiftDate = CurrentShiftDate(refTime) GetCurrentShiftInfo = "ÇáæÑÏíÉ: " & Format(shiftDate, "yyyy-mm-dd") & " | " & _ "ÇáÏÎæá ÇáãÓãæÍ: " & Format(funFirstTimeB_In(refTime), "hh:nn") & " | " & _ "ÇáÎÑæÌ ÇáãÓãæÍ: " & Format(funLastTimeB_Out(refTime), "hh:nn") End Function '=== 7. ÇÎÊÈÇÑ ÇáãäØÞ === Public Function TestShiftLogic(Optional ByVal testTime As Date = 0) As String If testTime = 0 Then testTime = Now() TestShiftLogic = "ÇáæÞÊ: " & Format(testTime, "hh:nn:ss") & " ? " & GetCurrentShiftInfo(testTime) End Function Sub TestDebugPrint() Debug.Print TestShiftLogic() Debug.Print TestShiftLogic(#11:30:00 PM#) Debug.Print TestShiftLogic(#12:30:00 AM#) End Sub
-
وجهة نظرك منطقية وتحترم ينفع معاك الحل ده ؟ Public Function IsEveningShiftNow(Optional ByVal checkTime As Date = 0) As Boolean If checkTime = 0 Then checkTime = Time() IsEveningShiftNow = (checkTime >= TimeSerial(17, 0, 0)) Or (checkTime < TimeSerial(1, 0, 0)) End Function Public Function CurrentShiftDate(Optional ByVal currentTime As Date = 0) As Date If currentTime = 0 Then currentTime = Time() If IsEveningShiftNow(currentTime) Then If currentTime >= TimeSerial(17, 0, 0) Then CurrentShiftDate = Date Else CurrentShiftDate = Date - 1 End If Else CurrentShiftDate = Date End If End Function
-
الدالة لا تغير وقت النظام الحقيقي في الكمبيوتر الدالة محاكاة اختبار لمنطق الورديات بتغيير الوقت الحالي بشكل مؤقت لاختبار سلوك النظام في أوقات مختلفة دون انتظار مرور الوقت الحقيقي Public Function TestShiftLogic(Optional testTime As Date = 0) As String If testTime = 0 Then testTime = Now() ' 1. استخدم الوقت الحالي لو مفيش وقت محدد Dim originalTime As Date: originalTime = Time() ' 2. احفظ الوقت الأصلي Time = testTime ' 3. غير الوقت الحالي بشكل مؤقت ← **السر هنا** TestShiftLogic = "الوقت: " & Format(testTime, "hh:nn:ss") & " → " & GetCurrentShiftInfo() ' 4. نفذ الاختبار واحصل على النتيجة Time = originalTime ' 5. ارجع الوقت الأصلي ← **الأمان** End Function صارت الامور اوضح معك بهذا الشرح
-
اجابتى كانت من واقع خبرتى المتواضعه وفوق كل ذى علم عليم . شكرا ليك على هذه المعلومة سوف اقوم بالتجربة
-
موضوع اختيار نوع الخطوك العربية لا يوجد له حل الا عمل جدول للخطوط على ان تكتب بداخله اسم الخط كما سوف يراه ملف الورد تمام ولانى كنت متوقع هذا السؤال فى مرفقى قمت بكتابة كود يجلب كل اسماء الخطوط الى الجدول ويوجد اختيار بالتجربة فقط حدد الخطوط فقط التى تريد التعامل معها فى المستقبل لم استخدم دالة Foksh التى استعان بها لملئ مربع سرد الخطوط فى كل مرع يتم فيها فتح النموذج
-
طيب دى الفكرة الاولى '=== 1. فحص الوردية المسائية === Public Function IsEveningShiftNow() As Boolean Dim t As Date: t = Time() IsEveningShiftNow = (t >= #12:01:00 PM# And t < #12:00:00 AM#) End Function '=== 2. تاريخ الوردية الحالية === Public Function CurrentShiftDate() As Date CurrentShiftDate = IIf(IsEveningShiftNow(), Date, Date - 1) End Function '=== 3. وقت بداية التسجيل المسموح (قبل الدخول الرسمي) === Public Function funFirstTimeB_In() As Date Dim officialIn As String, freeMins As Long officialIn = Nz(DLookup("fatrah2_In", "tblTimeCtrl"), "17:00:00") freeMins = Nz(DLookup("free2_in", "tblTimeCtrl"), 30) funFirstTimeB_In = DateAdd("n", -freeMins, CurrentShiftDate + TimeValue(officialIn)) End Function '=== 4. وقت نهاية التسجيل المسموح (بعد الانصراف الرسمي) === Public Function funLastTimeB_Out() As Date Dim officialIn As String Dim workHours As Long, extraMins As Long officialIn = Nz(DLookup("fatrah2_In", "tblTimeCtrl"), "17:00:00") workHours = Nz(DLookup("hours_Work2", "tblTimeCtrl"), 8) extraMins = Nz(DLookup("free2_out", "tblTimeCtrl"), 30) funLastTimeB_Out = DateAdd("n", (workHours * 60) + extraMins, _ CurrentShiftDate + TimeValue(officialIn)) End Function ودى فكرة تانية '=============================================================================== ' نظام تحديد ورديات الدوام المسائية مع أوقات التسجيل المسموح بها ' وردية مسائية: 17:00 → 01:00 (تمتد بعد منتصف الليل) '=============================================================================== '=== الثوابت للوردية المسائية === Private Const SHIFT_START_HOUR As Integer = 17 ' 5 مساءً Private Const SHIFT_END_HOUR As Integer = 1 ' 1 صباحًا Private Const DEFAULT_WORK_HOURS As Long = 8 Private Const DEFAULT_FREE_IN_MINS As Long = 30 Private Const DEFAULT_FREE_OUT_MINS As Long = 30 '=== 1. فحص ما إذا كان الوقت الحالي ضمن وردية مسائية === Public Function IsEveningShiftNow() As Boolean Dim t As Date: t = Time() IsEveningShiftNow = (t >= TimeSerial(SHIFT_START_HOUR, 0, 0)) Or (t < TimeSerial(SHIFT_END_HOUR, 0, 0)) End Function '=== 2. تاريخ الوردية الحالية (الأصح للورديات المتداخلة) === Public Function CurrentShiftDate() As Date If IsEveningShiftNow() Then ' إذا كان بعد 17:00 اليوم أو قبل 01:00 اليوم التالي If Time() >= TimeSerial(SHIFT_START_HOUR, 0, 0) Then CurrentShiftDate = Date Else CurrentShiftDate = Date - 1 End If Else CurrentShiftDate = Date End If End Function '=== 3. قراءة إعدادات الوردية مرة واحدة (تحسين الأداء) === Private Function GetShiftSettings() As Variant Static cachedSettings As Variant Static lastCacheTime As Date ' تجديد الكاش كل 5 دقائق If DateDiff("n", lastCacheTime, Now()) > 5 Then Dim rst As DAO.Recordset Set rst = CurrentDb.OpenRecordset("SELECT fatrah2_In, hours_Work2, free2_in, free2_out FROM tblTimeCtrl WHERE 1=1") If Not rst.EOF Then cachedSettings = Array( _ Nz(rst!fatrah2_In, "17:00:00"), _ Nz(rst!hours_Work2, DEFAULT_WORK_HOURS), _ Nz(rst!free2_in, DEFAULT_FREE_IN_MINS), _ Nz(rst!free2_out, DEFAULT_FREE_OUT_MINS) _ ) Else cachedSettings = Array("17:00:00", DEFAULT_WORK_HOURS, DEFAULT_FREE_IN_MINS, DEFAULT_FREE_OUT_MINS) End If rst.Close: Set rst = Nothing lastCacheTime = Now() End If GetShiftSettings = cachedSettings End Function '=== 4. وقت بداية التسجيل المسموح (قبل الدخول الرسمي) === Public Function funFirstTimeB_In() As Date Dim settings As Variant: settings = GetShiftSettings() Dim officialIn As Date: officialIn = TimeValue(settings(0)) Dim freeMins As Long: freeMins = CLng(settings(2)) funFirstTimeB_In = DateAdd("n", -freeMins, CurrentShiftDate + officialIn) End Function '=== 5. وقت نهاية التسجيل المسموح (بعد الانصراف الرسمي) === Public Function funLastTimeB_Out() As Date Dim settings As Variant: settings = GetShiftSettings() Dim officialIn As Date: officialIn = TimeValue(settings(0)) Dim workHours As Long: workHours = CLng(settings(1)) Dim extraMins As Long: extraMins = CLng(settings(3)) funLastTimeB_Out = DateAdd("n", (workHours * 60) + extraMins, CurrentShiftDate + officialIn) End Function '=== 6. وظائف إضافية للتحقق والاختبار === Public Function GetCurrentShiftInfo() As String Dim shiftDate As Date: shiftDate = CurrentShiftDate() GetCurrentShiftInfo = "الوردية: " & Format(shiftDate, "yyyy-mm-dd") & " | " & _ "الدخول المسموح: " & Format(funFirstTimeB_In(), "hh:nn") & " | " & _ "الخروج المسموح: " & Format(funLastTimeB_Out(), "hh:nn") End Function Public Function TestShiftLogic(Optional testTime As Date = 0) As String If testTime = 0 Then testTime = Now() Dim originalTime As Date: originalTime = Time() Time = testTime ' اختبار مؤقت TestShiftLogic = "الوقت: " & Format(testTime, "hh:nn:ss") & " → " & GetCurrentShiftInfo() Time = originalTime ' إعادة الوقت الأصلي End Function بصراحة لم اقم باى تجارب خى مجرد تعديلات للاكواد بشكل نظرى تماما وفق فهمى
-
موضوع الخبرة هذا ارى فيه مبالغة وضعت الخطاب يمثل المنتدى فقط للتجربة وكنت اقصد ان يكون النص كبير لتجربة التحكم الكامل فى تكبير العناصر وتغيير مواضعها On RunTime فى وقت العرض المباشر بدون فتح التصميم لم افهم من يوسف هذا ؟ واضح فى لبس حتى ان احدهم راسلنى على الخاص ظنا منه انه يعرفنى وبالنسبة لوصف حضرتك فى الوصف هذا لم يعطيك حقك اساسا منتظر راى حضرتك فى الية التحكم والافكار
-
االرجاء الانتظار الى الانتهاء من باقى التعديلات CertificateCustomization.zip
-
وانا عند وعدى هذه مشاركتى 1- بعد فك الضغط انقل الصور الى المجلد : TempResources 2- قم بفتح قاعدة البيانات 3- فى المستقبل فقط اضف اى صور الى المجلد : TempResources فى جزء لم انته منه بعد حفظ الاعدادت كقوالب او حفظ الاعدادت لكل شهادة ان اردنا ان تكون كقاعدة بيانات للاحتفاظ بالبيانت وليس مجرد موديولر لعمل الشهادات ويتبقى الجزء الاخير انا افكر فى الطباعة من النموذج الفرعى بشكل مباشر بدون اى تقارير الى لقاء قريب بعد ان اعرف ارائكم فى التطبيق والافكار البسيطة المتواضعة
-
طيب سوف تكون مشاركتى بعدك مباشرة سوف تكون مشاركتى مفاجأه إستعد
-
نموذج فرعي داخل صفحة رئيسية بقائمة جانبية
Debug Ace replied to Emad.85's topic in قسم الأكسيس Access
فضلت ابحث فى المنتدى عن موضوع صفحة رئيسية لاستاذ ابو جودي الى ان وجدت الموضوع طيب المرفق الاول على طريقة ابو جودي والمرفق الثانى من هذا الموضوع والذى يخص الاستاذ Foksh قمت بتعديل بسيط واضافة بسيطة جدا قائمة جانبية على طريقة ابو جودى.zip قائمة جانبية على طريقة الاستاذ Foksh.zip -
بالفعل مثل ما تفضل الاستاذ : Foksh المشكلة دي مش من Access نفسه قد ما هي من تعريف الطابعة + إعدادات الصفحة المختلفين بين الجهازين وخصوصا مع الهوامش 0 وصورة كاملة صفحة ليه التصميم بيخرب بين الجهازين؟ كل تقرير في Access بيتضبط على خصائص الطابعة الافتراضية وقت التصميم لذلك أي اختلاف في تعريف الطابعة أو نوع الورق/الهوامش يخلي التقرير يعيد حساب المقاسات وتمركز الصورة والكنترولز أغلب تعريفات الطابعات أصلا لا تسمح بهوامش 0 حقيقية فتجبر هامش أدنى (مثلا 3–5 مم من كل جانب) وده اللي يخلي الصورة تتصغر أو تتزحزح ويظهر كأن فيه هوامش رغم إنها 0 في التقرير على ويندوز 7 غالبا تعريف الطابعة مختلف أو إعدادات الـ Page Setup غير اللي على ويندوز 10 ماذا تفعل على كل جهاز افتح التقرير في معاينة قبل الطباعةثم اختر إعداد الصفحة Page Setup تأكد أن: حجم الورقة A4 الهوامش Manual وليست إعدادات خاصة بالطابعة (لو 0 عمل مشاكل استخدم 0.25 سم مثلا واضبط حجم الصورة بحيث تملأ المساحة داخل الهامش) ثبت نفس تعريف الطابعة ونفس الإعداد كـ Default على الجهازين قدر الإمكان Access يعتمد على تعريف الطابعة في حساب عرض وارتفاع التقرير لو حابب يمكن ضبط التقرير بحيث: حجم التقرير نفسه يساوي A4 ناقص أقل هامش تدعمه الطابعة (مثلا عرض 19.7 سم بدل 21 سم) والصورة تمتد داخل هذا المقاس كده هتاخد شكل فول بليد تقريبا على كل الأجهزة بدون ما يتلخبط التخطيط