برمجة جافا موبايل باستخدام Java ME

السلام عليكم ورحمة الله

Coverملحوظة:

اسهل طريقة لبرمجة جافا موبايل هو استخدام  NetBeans EE النسخة رقم  7.0 مع جافا ٣٢ بت أي يجب تثبيت ألة جافا الإفتراضية 32 بت (JDK 32 bit) حتى لو كان نظام التشغيل 64 بت.

مثلاً اسم النُسخة لنظام لينكس هي netbeans-7.0-ml-linux.sh ولنظام وندوز netbeans-7.0-ml-windows.exe

أمس اشتريت جهاز Samsung Texto plus، وهو يُعتبر من اﻷجهزة المتوسطة السعر، ويميل إلى الرخيص، حيث كان سعره حوالي 70 دولار. وبالرغم من هذا فهو أغلي موبايل أقوم بشراءه، فلم أكُن أنوي شراء موبايل ذكي (إذا اعتبرنا أنه ذكي، أو أن الذكاء هي أحد ميزات الموبيالات)، كُنت أكتفي باﻷجهزة البسيطة والتي أستطيع من خلالها التحدث وإرسال وإستقبال الرسائل، وسماع القرآن من ملفات MP3، دون أن يقيدني بحمله والحرص عليه طوال الوقت مخافة أن يضيع، فالمبويايل البسيط يُمكن أن تتركه في أي مكان وأنت مطمئن. أما تصفح النت فكنت أفضله، ولا زلت أفضله بإستخدام حاسوب أو لابتوب، وتطوير البرامج بإستخدام لوحة مفاتيح كاملة، وليست لوحة مفاتيح لابتوب، وشاشة خارجية (أكبر من شاشة لابتوب).

في أثناء تفقد ميزات الموبايل وبرامجه- وهو مازال في الشاحن- لفت نظري أن به برامج جافا موبايل، فأسرعت إلى الكمبيوتر لتشغيل Net Beans ووجدت أنه يدعم تطوير Java ME وهي Java Micro Edition، مخصصة للأجهزة المُدمجة والموبايلات. وبخلاف اﻷندويد والـ iOS، فهي غير معتمدة على نوع نظام تشغيل الهاتف، تحتاج لمشغل لها في أنظمة سيمبيان أو أي أنظمة أخرى، ولا أرى ما يمنع أن يتم تطوير هذا المشغل (Virtual machine) في بيئة اﻷندرويد مثلاً.

شعرت بفرح كبير عند تشغيل أول برنامج Hello World، في الموبايل، بعد محاولتين، حيث أن المحاولة اﻷولى فشلت وذللك بسبب عدم معرفتي بنسخة المشغل الموجودة. ويُمكن عمل برامج جافا موبايل في بيئة Net Beans عن طريق:

New Project/Java ME/Mobile Application

ويوجد محاكي موبايل لتشغيل البرنامج. وفي النهاية نقوم بنقل المجلدdist الذي يحتوي على المفات ذات اﻹمتداد jad و jar

بعدها قررت أن أقوم في يوم من اﻷيام بعمل برنامج مواقيت الصلاة لولاية الخرطوم، حيث أنه لدي البيانات اليومية لمواقيت الصلاة كُنت قد كتبتها في عام 1997، وقُمت باستخدامها في أكثر من برنامج. كانت لدي مشاريع أخرى لهذا اليوم، لكن لم استطع أن أقاوم، فهذه أول مرة أقوم بعمل برنامج لموبايل، فجلست باقي اليوم أطور في برنامج مواقيت الصلاة، وقراءة كود الجافا. والحمد لله وجدت دعم كبير في اﻹنترنت لكل مشكلة واجهتي.

وقد قُمت بتجربة البرنامج في موبال آخر صيني، وقد عمل فيه البرنامج أيضاً.

لكن لاحظت أن لغة جافا، وباﻷخص جافا موبايل فيها بعض التعقيد للمهات العادية، كقراءة ملف نصي، أوالتعامل مع التاريخ. فمثلاً هذا كود للقراءة من ملف نصي في لغة Java ME:

class FileRead
{
public static void main(String args[])
{
  try{
    FileInputStream fstream = new FileInputStream("textfile.txt");

    DataInputStream in = new DataInputStream(fstream);
    BufferedReader br = new BufferedReader(new InputStreamReader(in));
    String strLine;

    while ((strLine = br.readLine()) != null)   {

    System.out.println (strLine);
  }

  in.close();
}catch (Exception e){
  System.err.println("Error: " + e.getMessage());
}
}

وهذه مقارنة لقراءة ملف نصي بلغة أوبجكت باسكال:

procedure ReadTextFile;
var
  List: TStringList;
  i: Integer;
begin
  try
    List:= TStringList.Create;
    List.LoadFromFile('/proc/cpuinfo');
    for i:= 0 to List.Count - 1 do
      Writeln(List[i]);

    List.Free;

  except
  on e: exception do
    Writeln(e.Message);
  end;
end;

وهذا لقراءة ملف نصي بإستخدام مونو C#


public static void Main (string[] args)
{
  try
  {

    using (StreamReader sr = new StreamReader("/proc/cpuinfo"))
    {
      String line;
      while ((line = sr.ReadLine()) != null)
      {
        Console.WriteLine(line);
      }
    }
    }
      catch (Exception e)
    {
      Console.WriteLine("The file could not be read:");
      Console.WriteLine(e.Message);
    };
 }

نلاحظ أن لغة جافا إحتاجت لثلاث Classes لقراءة الملف النصي، بينما أوبجكت باسكال وسي شارب إحتاجت لواحد فقط.

وهذه مثال لإضافة ساعتين للوقت الحالي وإظهاره بشكل محدد، في جافا العادية:


  Calendar cal = Calendar.getInstance();
  Format myTimeFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
  cal.add(Calendar.HOUR, 2);
  System.out.println(myTimeFormat.format(cal.getTime()));

وهذه نفس العملية بلغة أوجكت باسكال:


  Writeln(FormatDateTime('yyy-mm-dd hh:nn:ss', Now + EncodeTime(2, 0, 0, 0)));

وهذا نفس الشيء بإستخدام مونو C#:


  DateTime dateValue = new DateTime();
  dateValue = DateTime.Now.AddHours(2);
  Console.WriteLine(dateValue.ToString("yyyy-MM-dd hh:mm:ss"));

وفي الختام فإن التجربة كانت ممتعة وتعلمت منها كثيراً. ومع أن برمجة الموبايلات متجهة نحو اﻹندويد وiOS، إلا أنه مايزال عدد كبير من اﻷجهزة الرخصية والمتوسطة السعر تدعم هذه التقنية، حسب إحصائية موقع صن، فإن عدد الموبايلات التي تحتوي على جافا موبايل هي 3 مليارات.

الكاتب: أبو إياس

مهندس برمجيات

79 رأي حول “برمجة جافا موبايل باستخدام Java ME”

  1. هنا أنت قدمت شيئين جميلين عن الجافا:
    * أنها لغةٌ متعددة الأرضيات بامتياز، و لها مكتبةٌ قياسيةٌ قوية بالفعل و تغطي مديً كبيراً للغاية من المجالات البرمجية، و هذا ما أدي إلي أنها الأولي عالمياً من حيث عدد المبرمجين بها (أو الثانية علي الأقل).
    * أن مكتبتها تضطرك في بعض الأحيان لقول الكثير حتي تصف ما تريد، بينما هناك لغاتٌ أخري تُنفذ ما تريد من خلال أقل قدرٍ ممكنٍ من الجُمل. و أظن أن هذا راجعٌ إلي ضخامة المكتبة الشديدة، فلا يستطيع مطوروها و لا يُتاح لهم الوقت لكي يكتبوا أصنافاً classes عالية المستوي تختصر الطريق علي المبرمجين بها.

    يُمكنك بكل تأكيد كمبرمج منعزلٍ عنهم أن تصنع غلافاً wrapper حول تلك الأصناف التي تحتاجها بكثرة بحيث يلخص الأكواد التي تكتبها بكثرة و تستهلك وقتاً كبيراً، و هذا هو الحل الأفضل في نظري، و ربما بعد فترةٍ زمنيةٍ يتحول الغلاف إلي مكتبةٍ قوية يستطيع الآخرون الاستفادة منها في عملهم، و قد حدث هذا علي سبيل المثال مع مكتبة EZGUI المكتوبة بلغة PoweBasic:

  2. بالنسبة لأنها تخدم تعدد المنصات فهذا صحيح. لكن يوجد فرق بين أوامر جافا للموبايل وباقي اﻷنظمة اﻷخرى، فمثلاً المثال السابق المكتوب لإضافة ساعتين لا يعمل مع الموبايل، جلست أكثر من ساعة أبحث في اﻹنترنت وأجرب لأجد حل، وفي النهاية كان الحل لهذه المشكلة البسيطة حوالي خمسة عشر سطراً فقط لإضافة ساعة وعدد من الدقائق. وحتى البلاك بيري له أوامره للجافا مختلفة أحياناً عن برمجة جافا me
    لكن في النهاية الفكرة العامة واحدة، ومن استخدم جافا يستطيع بسهولة الدخول إلى أي من منصاتها المختلفة بسهولة.
    المتطلبات البرمجية أصبحت في إزدياد وتعقيد، ويجب لحل المشاكل البرمجية تقديم حلول بسيطة وسهلة، وليس حلول معقدة. لذلك نطلب من كل لغات البرمجة المستقبلية أن توفر حلول سهلة، ومنطقية، ومتوقعة للمسائل البسيطة والمسائل المعقدة.

  3. قُمت بإنزال البرنامج في الوندوز، لكنه لم يقم بترجمة البرامج، وقد حاولت تشغيل الآمثلة المصاحبة له بدون فائدة. يظهر أن به مشكلة مع وندوز 7

      1. نعم نجحت الطريقة في الترجمة وإخراج ملفات تنفيذية. لكن لايوجد محاكي موبايل معه، لذلك أقوم بنقل الملف التنفيذي إلى الموبايل لتجربته، ولاحظت أيضاً أنها لغة باسكال العادية (هيكلية) وليست هدفية (أوبجكت باسكال)

  4. اختلاف الأوامرلفعل نفس الشيء لكل منصة مع أنها لا ترتبط منطقياً بالعتاد شيءٌ غريبٌ بالفعل !
    ربما يكون هذا بسبب اختلاف مبرمجي المكتبات لكل منصة، و لكن حتي في هذه الحالة فيجب عليهم أن ينتبهوا إلي جزئية توحيد الواجهة قدر الإمكان حتي يسهل الأمر علي المبرمجين للتنقل بين الأجهزة المختلفة بمنحني تعليمٍ بسيط !
    أري أن هذه غلطةٌ هندسيةٌ في تصميم المكتبة، و لكن يمكن حلها أيضاً عن طريق طبقةٍ تغلف كل هذا 🙂

    بخصوص اللغات الجديدة: أظن أن البساطة ستكون من اولويات مصممي تلك اللغات.

  5. اﻷخ وائل حسن، هلا ساعدتنا في ترجمة هذا اﻷجراء (تحويل تاريخ ميلادي إلى هجري)، جلست أمس حوالي أربع ساعات لمحاولة تشغيله في الجافا، لكن لم تكن النتائج صحيحة. فقط السنة رجعت صحيحة. وهو مكتوب بلغة أوبجكت باسكال، أريد تحويله إلى جافا العادية:

    procedure DateToHejri(ADateTime: TDateTime; var Year, Month, Day: Word);
    const
      HejriYearDays = 354.367056;
      HejriMonthDays = 29.530588;
    
    var
      HejriYear: Extended;
      Days: Extended;
      HejriMonth: Extended;
      RDay: Extended;
      HejriStart: TDateTime;
    begin
      // Initialize first day of hejri calender: 16-July-622
      HejriStart:= EncodeDate(622, 7, 16);
    
      // Get Hejri year, calculate the difference between given date and Hejri Start date
      HejriYear:= ((Trunc(ADateTime) - HejriStart - 1) / HejriYearDays);
    
      // Get remaining (fraction) of year as days
      Days:= Frac(HejriYear);
    
      // Return Hejri Year
      Year:= Trunc(HejriYear) + 1;
    
      // Calculate monthes
      HejriMonth:= ((Days * HejriYearDays) / HejriMonthDays);
    
      // Return Hejri month
      Month:= Trunc(HejriMonth) + 1;
    
      // Calcuate days after extracting monthes
      RDay:= (Frac(HejriMonth) * HejriMonthDays) + 1;
    
      // Return day
      Day:= Trunc(RDay);
    end;   
    
  6. ها هي ذي الترجمة بالأسفل، حاولت أن أجعل الكود أقرب ما يمكن لما كتبتَه، و لكن في الترجمة ستري أنني لم أستطع تحويل دالة EncodeDate لما يناظرها بالجافا لعدم معرفتي له (أظن أنك قد تجاوزت هذه النقطة في محاولاتك :

    public MyDate DateToHejri(double ADateTime){
          final double HejriYearDays = 354.367056;
          final double HejriMonthDays = 29.530588;
          MyDate hejri_date = new MyDate();
          
          // Initialize first day of hejri calender: 16-July-622
          double HejriStart = EncodeDate(622, 7, 16);
    
          // Get Hejri year, calculate the difference between given date and Hejri Start date
          double HejriYear = ((trunc(ADateTime) - HejriStart - 1) / HejriYearDays);
    
          // Get remaining (fraction) of year as days
          double Days = frac(HejriYear);
    
          // Return Hejri Year
          hejri_date.year = trunc(HejriYear) + 1;
    
          // Calculate monthes
          double HejriMonth = ((Days * HejriYearDays) / HejriMonthDays);
    
          // Return Hejri month
          hejri_date.month = trunc(HejriMonth) + 1;
    
          // Calcuate days after extracting monthes
          double RDay = (frac(HejriMonth) * HejriMonthDays) + 1;
    
          // Return day
          hejri_date.day = trunc(RDay);
          
          return hejri_date;
        }
        int trunc(double x){
            return (int)x;
        }
        double frac(double x){
            return x - (int)x;
        }
        class MyDate{
            long year;
            int month;
            int day;
        }
    
  7. شكراً لك اﻷخ وائل على هذا المجهود. مع بعض التعديلات أعطاني نفس النتيجة التي أعطانيها البرنامج الذي كتبته أمس وهو يوم 9 شهر 6 سنة 1433، كان المفترض أن يكون 14 شهر 7 عام 1433
    وهذا هو الكود بعد التعديل:

    public MyDate dateToHejri(Date ADateTime){
    	      final double HejriYearDays = 354.367056;
    	      final double HejriMonthDays = 29.530588;
    	      MyDate hejri_date = new MyDate();
    	       
    	      // Initialize first day of hejri calender: 16-July-622
    	      
              Calendar HejriStart = Calendar.getInstance();
              
              HejriStart.set(Calendar.HOUR_OF_DAY, 0);
              HejriStart.set(Calendar.MINUTE, 0);
              HejriStart.set(Calendar.SECOND, 0);
              HejriStart.set(Calendar.MILLISECOND, 0);
              
              HejriStart.set(Calendar.YEAR, 622);
              HejriStart.set(Calendar.MONTH, 7);
              HejriStart.set(Calendar.DAY_OF_MONTH, 16);
                  
    	 double dHejriStart = (((HejriStart.getTimeInMillis() / 1000) / 60) / 60) / 24;
    	 double dDateTime = (((ADateTime.getTime() / 1000) / 60) / 60) / 24;
    	      // Get Hejri year, calculate the difference between given date and Hejri Start date
    	      double HejriYear = ((trunc(dDateTime) - dHejriStart - 1) / HejriYearDays);
    	 
    	      // Get remaining (fraction) of year as days
    	      double Days = frac(HejriYear);
    	 
    	      // Return Hejri Year
    	      hejri_date.year = trunc(HejriYear) + 1;
    	 
    	      // Calculate monthes
    	      double HejriMonth = ((Days * HejriYearDays) / HejriMonthDays);
    	 
    	      // Return Hejri month
    	      hejri_date.month = trunc(HejriMonth) + 1;
    	 
    	      // Calcuate days after extracting monthes
    	      double RDay = (frac(HejriMonth) * HejriMonthDays) + 1;
    	 
    	      // Return day
    	      hejri_date.day = trunc(RDay);
    	       
    	      return hejri_date;
    	    }
    	    int trunc(double x){
    	        return (int)x;
    	    }
    	    double frac(double x){
    	        return x - (int)x;
    	    }
    	    class MyDate{
    	        long year;
    	        int month;
    	        int day;
    	    }
    
    

    وهذا هو نداء الدالة:

        private void get(java.awt.event.ActionEvent evt) {                     
            // TODO add your handling code here:
            Date today = new Date();
          
            MyDate hejriCal = new MyDate();
            hejriCal = dateToHejri(today);
            jLabel1.setText(hejriCal.year + "-" + hejriCal.month + "-" + hejriCal.day);            
              
        } 
    

    ملاحظة:
    لتنسيق الكود أكتب كلمة code بين مربعين، ثم في النهاية أكبر /code بين مربعين أيضاً

  8. السلام عليكم اريد مساعدة عن برنامج توقيت الصلاة ومع الاذان اخوك سمير من كوردستان العراق

  9. السلام عليكم اخ العزيز اريد قوم بانشاء برنامج مواقيت الصلاة لمدينتنا ومع الاذان حتى الان ماعدنا مواقيت للموبايل مع الاذان
    اريد قوم بهذا البرنامج وانت معى حتى النهاية واريد شرح بالفيديو ومع كودات اه لونجحنا بهذا خيرالجاري هذة الفكرة واحد من افكاري في الدونيا و من سيربح المليون والسلام عليكم

  10. يوجد أخ فلسطيني في مصر نسيت اسمه، قد قام بعمل برنامج (إلى صلاتي) وفيه عدد كبير من المُدن، وبرنامجه يعتمد على الموقع الجغرافي للمدينة Long, Lat
    بالنسبة للبرنامج الذي قُمت بعمله هو يصلح فقط للخرطوم
    يُمكنك اﻹستفادة إيضاً من برنامج minbar في نظام لينكس، فيه اذان أيضاً، وهو مفتوح المصدر على ما أعتقد

  11. انا ابخث في كوكل لايوجد شيء بهذا الاسم مينبر باي برنامج انت صنعت ؟ واذا انت عندك عنوان قول لي باي مشروع عن الصلاة؟ وشكرا لك

  12. اخ العزيز اريد مشاريعك او كودك اريد بهذا طريقة صنعت مع سبيل المثال العصر-2:45 موخط جغرافي عندي كودات كامل السنة

  13. أنا لم استخدم خطوط العرض أو الطول، إنما قُمت بكتابة مواقيت الصلاة في الخرطوم لسنة كاملة (إخترت يوم من كل إسبوع). لذلك فهي تصلح فقط للخرطوم. هل تُريدني أن ارسل لك برنامج الجافا الذي يعمل في الموبايل؟

  14. السلام عليك نعم استاذ انااريد نفس خطواطك وافكارك ادخل كل كودات اوقات الصلاة كل يوم وسنةكاملة بس ارسل مشروعك اوقات الصلاةالخرطوم حتى انا تبديل كودات اوقات الصلاة لمدينتنا والى جميع مناطق الكوردستان؟استاذ انامحتاج الى افكارك وشكرا

  15. شكرا لك جزاك الله الجنة واريد البرنامج هذا المشروع :عندي نيت بينس بس صعبة باي برنامج انت صنعت؟

  16. توجد نُسخة أخرى من البرنامج مكتوبة بواسطة دلفي 7 وفيها اﻵذان. وتوجد نُسخة أخرى بواسطة لازاراس، هل أرسل أحدهما لك في حالة فشل فتح مشروع NetBeans

  17. السلام عليكم”انا طالبة جامعية عندي مشروع عاذي السنة رح اعملو حولا تصميم لعبه ع الموبايل “بدي مساعدة منكو يا اساتذة”وشو رايكم بهذا الموضوعط

  18. وعليكم السلام.
    المهم تحديد نوع اﻷجهزة المستهدفة، مثلاً أندرويد، أي فون، وندوز فون. ثم تعلم اللغة التي يتم بها البرمجة للنوع الذي تم إختياره

  19. السلام عليكم” استاذ اريد فيديوتعليمى صنع اوقات الصلاة بشكل مقصرمن البدايةالى التهايةببرنامج نيت بينس ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

  20. السلام عليكم
    أخى سمير، لا يوجد فيدو مفصل لصنع برنامج صلاة أو برنامج حسابات أو غيرها من البرامج، إنما توجد فقط فيديوهات وكتيب ومواقع لتعليم لغات البرمجة، وإذا أتقنت لغة برمجة تستطيع أن تعمل بها ماتشاء من برامج.
    فنصيحتي لك أن تتعلم لغة جافا بواسطة NetBeans ثم بعد ذلك التفكير في عمل برنامج لمواقيت الصلاة

  21. وعليكم السلام”جوابك صح”بس استاذ الان ماعدنا برامج مواقيت الصلاة مع الاذان بلغةجافا في الكوردستان كامل في اي موبايل واي مكان”استاذ انا معلم الان يعني ماكو وقت حتى اقوم بهذا المشروع……………..

  22. استاذ انا اقولك انت قوم بهذا العمل الخيري الجاري بالفيديو تعلمني حتى اقدر اصنع هذا المشروع…………………….

  23. أنا اﻵن أعمل في ثلاث مشاريع في نفس الوقت، وقتي مزدحم جداً.
    يُمكنك البحث عن برنامج مواقيت صلاة له إمكانية إضافة خط الطول والعرض لمعرفة مواقيت الصلاة في هذه المدينة

  24. السلام عليكم اﻷخ مصطفى،
    في الحقيقة أنا لست مبرمج برامج موبايل، وليست لي خبرة في برمجة الـ IOS أو حتى استخدام ال I-Phone. البرنامج الوحيد الذي قُمت بكتابته هو برنامج بإستخدام جافا ME وقُمت بتشغيله في أجهزة الموبايل التي تدعم جافا موبايل.

  25. السلام عليكم اريد من سيادتكم مساعدتي في برنامج بالاندرويد للكشف عن اقرب مستشفيات موجودة في المنطقة اريدكود الجافا وxml ولكم جزيل الشكر

  26. السلام عليك اخ العزيز: حتى الان انا انتضارك اذا عندك وقت اريد كيفية صنع بالفيديو تعليم خطوة بخطوة عن برامج اوقات الصلاة بالجافا اونيت بينس
    وعليكم السلام

  27. السلام عليكم
    اﻷخ سمير، للأسف ليس لدي وقت، وقتي مذرحم جداً بحوالي 4 مشاريع أو أكثر أعمل عليهم حالياً وفي نفس الوقت

  28. السلام عليكم استاذ هل عندك برامج فلاش بها تاريخ الهجري الان احتاج ضروري ب تاريخ الهجرة؟استاذ اذا عندك كود تاريخ الهجرة في استعمال في ماكروميديا فلاش او سويش ماكس؟

  29. استاذ والله الان احتاج كود تاريخ الهجرة اذا اقدر اريد فيديو تعليمي كيف يصنع برامج تاريخ الهجرة.

  30. السلام عليكم استاذ اريد كود تاريخ الهجرة للنيت بينس بس كامل بدون مشاكل حتى لصق للبرامج نيت بينس. واذا عندك مشروع برامج تاريخ الهجرة ارسل لي.

  31. onSelfEvent (enterFrame)
    {

    bb= new Date()
    day=bb.getDate()
    heif=bb.getMonth()+1 // 1-12
    if(heif==1)
    {
    if(day==1)
    {a=”06:21″;b=”05:06″;c=”02:45″;d=”12:16″;e=”07:21″;f=”06:02″;g=”05:47″} استاذ كيف اقدرمع هذا الاوقات شغل الصوت يعني العصر(02:45)وشغل الصوت الاذان مع :الان انا كملت برامج الاذان بس اريد مع صوت الاذان.

  32. لم أستطع كتابة كود التحويل إلى التاريخ الهجري بواسطة لغة جافا، وقد حاول الأخ وائل حسن مساعدتي في معرفة المشكلة لكن في النهاية لم ينجح الأمر

  33. السلام عليك كيف اقدرمع هذاكودonSelfEvent (enterFrame)
    {

    bb= new Date()
    day=bb.getDate()
    heif=bb.getMonth()+1 // 1-12
    if(heif==1)
    {
    if(day==1)
    {a=”06:21″;b=”05:06″;c=”02:45″;d=”12:16″;e=”07:21″;f=”06:02″;g=”05:47″}في برامج سويش ماكس4شغل صوت مع يعني مع هذا الكوداوقات الصلاةplay sound

  34. المشكلة في ان الدالة HejriStart.getTimeInMillis() ترجع قيمة غير صحيحة(حسب حساباتي !) ،
    حيث يفترض ان تقوم بارجاع الفرق بين التاريخ HejriStart ويوم 1-1-1970
    الدالة ترجع القيمة -4.25189E13 ملي ثانية يعني 492117 يوما ، لكن القيمة الصحيحة هي
    (1970-623)*365.25 =491991.75
    وباضافة الخمسة اشهر 5*30.5 و16 يوم يكون الناتج 492160 يوما الفرق 44 يوما !!
    بالنسبة لبرنامج الباسكال الدالة EncodeDate ترجع القيمة 4466582- ولكن بالحساب القيمة الصحيحة هي 466592- الفرق 10 ايام !
    ما رأي الأستاذ ابو اياس؟
    خلط اللغة العربية بالانجليزية الكلام صعب القراءة فاعذروني.

  35. التاريخ الهجري بالجافا كانت فيه المشكلة التي ذكرتها في الجافا، لكن لم أعد أتذكر جيداً، فقط عملت عليها أيام متواصلة دون أن أصل إلى نتيجة.
    هل تستطيع إكمال التجارب في هذا الموضوع في جافا والوصول إلى نتائج؟

  36. لقد عرفت سبب فرق العشرة ايام في كود لازاراس : طريقة التي حسبت بها غير صحيحة، فبعد قراءة هذه المقالة في ويكيبيديا http://ar.wikipedia.org/wiki/تقويم_ميلادي عرفت ان السنة التي تقبل القسمة على 100 تعتبر سنة غير كبيسة الا اذا كانت تقبل القسمة على 400 ، اي ان القاعدة التى نعرفها بان السنة الكبيسة هي التي تقبل القسمة على اربعة غير صحيحة!
    الكود التالي يعطي نتائج مطابقة للكود المكتوب بلازاراس لكنه غير قادر على تمييز المدخلات الخاطئة (مثل 29-2-2011) لم اعرف سبب القيم (الغريبة!)الت تعيدها الدالة getTimeInMillis()

    class MyDate {
    
        public MyDate(long year, int month, int day) {
            this.year = year;
            this.month = month;
            this.day = day;
        }
    
        public MyDate() {
        }
        long year;
        int month;
        int day;
    }
    
    public class miladi_to_hijri {
        
         public boolean is_leap(int year) {
            if (year % 4 == 0 && year % 100 != 0) {
                return true;
            }
            if (year % 100 == 0 && year % 400 == 0) {
                return true;
            }
            return false;
        }
    
        public void add_day(MyDate a) {
            if (a.day == 28 && a.month == 2 && !is_leap((int) a.year)) {
                a.month = 3;
                a.day = 1;
                return;
            }
            if (a.day == 29 && a.month == 2) {
                a.month = 3;
                a.day = 1;
                return;
            }
            if (a.day == 31 && (a.month == 1 || a.month == 3 || a.month == 5 || a.month == 7 || a.month == 8 || a.month == 10)) {
                a.month++;
                a.day = 1;
                return;
            }
            if (a.day == 30 && (a.month == 4 || a.month == 6 || a.month == 9 || a.month == 11)) {
                a.month++;
                a.day = 1;
                return;
            }
            if (a.day == 31 && a.month == 12) {
                a.month = 1;
                a.day = 1;
                a.year++;
                return;
            }
            a.day++;
            return;
        }
    private boolean sort_date(MyDate first_date, MyDate sec_date){
         if(first_date.year>sec_date.year) {
            return true;
        }
             if(first_date.year>sec_date.year&&first_date.month>sec_date.month) {
            return true;
        }
             if(first_date.year>sec_date.year&&first_date.month>sec_date.month&&first_date.day>sec_date.day){
            return true;
        }
                         return false;
     }
        private int get_day_def(MyDate first_date, MyDate sec_date) {
            int i = 0,k=1;
            MyDate temp;
            if(sort_date(first_date, sec_date)) {
                k=-1;
                temp=first_date;
                first_date=sec_date;
                sec_date=temp;
            }
            while (first_date.year != sec_date.year || first_date.month != sec_date.month || first_date.day != sec_date.day) {
                add_day(first_date);
                i++;
            }
            return i*k;
        }
     public MyDate dateToHejri(MyDate target) {
            final double HejriYearDays = 354.367056;
            final double HejriMonthDays = 29.530588;
            MyDate hejri_date = new MyDate();
            int i, i2;
            MyDate hijristart = new MyDate(622,7,16);
            MyDate day = new MyDate(target.year,target.month,target.day);
            MyDate epoch = new MyDate(1970,1,1);
            i=get_day_def(hijristart,epoch);
            i2=get_day_def(epoch,day );
            double dHejriStart = -1 * i;// (((h2.getTimeInMillis()/ 1000) / 60) / 60) / 24;//70*365.25+1;
            double dDateTime = i2;
            // Get Hejri year, calculate the difference between given date and Hejri Start date
            double HejriYear = ((trunc(dDateTime) - dHejriStart - 1) / HejriYearDays);
            // Get remaining (fraction) of year as days
            double Days = frac(HejriYear);
            // Return Hejri Year
            hejri_date.year = trunc(HejriYear) + 1;
            // Calculate monthes
            double HejriMonth = ((Days * HejriYearDays) / HejriMonthDays);
            // Return Hejri month
            hejri_date.month = trunc(HejriMonth) + 1;
            // Calcuate days after extracting monthes
            double RDay = (frac(HejriMonth) * HejriMonthDays) + 1;
            // Return day
            hejri_date.day = trunc(RDay);
            System.out.println(hejri_date.year+" "+hejri_date.month+" "+hejri_date.day+" ");
            return hejri_date;
        }
    
        int trunc(double x) {
            return (int) x;
        }
    
        double frac(double x) {
            return x - (int) x;
        }
    }
    
  37. شكراً لك على هذا الاجتهاد. سوف أقوم بتجربتها في أقرب وقت إن شاء الله.
    بالنسبة للسنة الكبيسة فهي كانت إضافة ليس لها داعي، قمت بحذفها منذ زمن طويل، نحن لانحتاجها في التحويل. لكن ربما لم أحذفها من المكتبة الموجودة في الموقع

  38. اخي العزيز هناك طريقة اسهل ل تصميم برامج الجوال
    ,, الطريقة هي
    استخدام pys60
    و استخدام بايثون لل برمجة

  39. ربنا يعوضك خير إن شاء الله
    نظام سيمبيان متجه إلى نهاية، انصح بإستثمار التعلم في نُظم تشغيل متجهة إلى المستقبل مثل Android, IOS

  40. مرحبً
    اني شخص اعشق البرمجة من صغري
    اجيد العديد من لغات البرمجة منهى c c++ java و بايثون و روبي و فري باسكال/لازرس و لغة التجميع

    قمت ب تصميم الكثير من البرامج ل الاستخدام الشخصي
    و قمت ب كتابت بعض الالمترجمات ل لغات البرمجة لل تسلية
    ولاكن المشكلة اني مكفوف (اعمى)
    استخدم برنامج قارء شاشة
    لذالك اني مقيد ب النسبت ل بعض مكتبات الواجهة الرسومية
    ف مثلن برنامج نت بيمز لا استطيع التعامل معه ب سبب عدم دعم برنامج قارؤ الشاشة له

    ب النسبة ل برامج الجافا اكتبهى ب برنامج المفكرة
    لذالك برمجت java me تبدو لي مستحيلة

  41. السلام عليكم ممكن تساعدني عندي برنامج من سيربح المليون ومابيشتغل الا مرة واحدة بعدها ال داتا بيس تتبعثر
    import java.util.Vector;
    import javax.microedition.lcdui.*;
    import javax.microedition.midlet.*;
    import javax.microedition.rms.*;

    public class MillionaireGame extends MIDlet implements CommandListener {
    // Form : form : Main Menu
    private Command play ;
    private Command admin;
    private Command back;
    private Command exit;
    private Display display;
    // private welcome;
    private Form form;
    private String st;
    private String st1;

    // Form : form1 : Admin
    private Form form1;
    private TextField txtpassword;
    private Command login;
    private Alert alert;
    // Form2: Menu in admin
    private Form form2;
    private Command add;
    private Command edit;
    private Command delete;
    private Command menu;
    private Command viewQuestion;
    //FormAdd
    private Form formadd;
    private TextField txtquestion;
    private TextField txtA;
    private TextField txtB;
    private TextField txtC;
    private TextField txtD;
    private TextField txtanswer;
    private Vector Vlist= new Vector();
    private RecordStore rs=null;
    private RecordEnumeration re;
    //FormEdit
    private List listedit;
    private Form formedit;
    private Form formshow;
    private StringItem storeRecords;
    private TextField txteditquestion;
    private TextField txteditA;
    private TextField txteditB;
    private TextField txteditC;
    private TextField txteditD;
    private TextField txteditanswer;
    private Command save;

    //FormDelete
    private Form formdelete;
    private TextField txtdelete;
    //Form Play Game
    private Form formquestion1;
    private Form formquestion2;
    private Form formquestion3;
    private Form formquestion4;
    private Form formquestion5;
    private Form formquestion6;
    private Form formresult;
    private ChoiceGroup cgplay;
    private Gauge gshow;
    private Ticker tkwinlose;
    private Command nextquestion;
    private Command select;
    private Command start;
    private int score=32;
    private int win=0;
    private int lose=0;
    public MillionaireGame()
    {
    // Form : Main Form
    form =new Form(“Millionaire Game App”);
    st= “Welcome to Millionaire Game App”;
    st1= ” Select Menu to Play Game”;
    play= new Command(“Play”, Command.SCREEN,1);
    admin=new Command(“Admin”, Command.SCREEN,2);
    exit = new Command(“Exit”,Command.EXIT, 1);
    back= new Command(“Back”,Command.BACK,1);
    form.addCommand(play);
    form.addCommand(admin);
    form.addCommand(exit);
    form.append(st);
    form.append(st1);

    form.setCommandListener(this);

    // form 1 : Form password
    form1 = new Form(“Log In to Administrator “);
    txtpassword = new TextField(“Password : “, “” , 6,TextField.PASSWORD | TextField.NUMERIC);
    form1. append(txtpassword);
    login = new Command(“Login”, Command.SCREEN,1);
    form1.addCommand(login);
    form1.addCommand(back);
    form1.setCommandListener(this);

    //form 2 : admin
    form2 = new Form(” Form Administrator “);
    String st2= “Welcome to Administrator”;
    form2.append(st2);
    add= new Command(“Add”,Command.SCREEN,1);
    edit = new Command(“Edit”, Command.SCREEN,2);
    viewQuestion= new Command(“View”,Command.SCREEN,2);
    menu= new Command(“Log out”, Command.BACK,1);
    form2.addCommand(add);
    form2.addCommand(viewQuestion);

    form2.addCommand(menu);
    form2.setCommandListener(this);

    //FormAdd:
    formadd = new Form(“Form Add record”);
    txtquestion= new TextField(“Question : “, “” ,40, TextField.ANY);
    txtA = new TextField(“Answer A: “, “” , 25,TextField.ANY);
    txtB = new TextField(“Answer B: “, “” , 25,TextField.ANY);
    txtC = new TextField(“Answer C: “, “” , 25,TextField.ANY);
    txtD = new TextField(“Answer D: “, “” , 25,TextField.ANY);
    txtanswer=new TextField(“Answer :”, “” , 10, TextField.ANY);
    formadd.append(txtquestion);
    formadd.append(txtA);
    formadd.append(txtB);
    formadd.append(txtC);
    formadd.append(txtD);
    formadd.append(txtanswer);
    formadd.addCommand(back);
    formadd.addCommand(add);
    formadd.setCommandListener(this);

    //Formedit
    //listedit= new List(“List Edit Records “, List.IMPLICIT);

    formedit = new Form(“Form Edit record”);
    listedit = new List(“List Edit Records”,List.IMPLICIT);
    txteditquestion= new TextField(“Question : “, “” ,40, TextField.ANY);
    txteditA = new TextField(“Answer A: “, “” , 25,TextField.ANY);
    txteditB = new TextField(“Answer B: “, “” , 25,TextField.ANY);
    txteditC = new TextField(“Answer C: “, “” , 25,TextField.ANY);
    txteditD = new TextField(“Answer D: “, “” , 25,TextField.ANY);
    txteditanswer=new TextField(“Answer :”, “” , 10, TextField.ANY);
    save= new Command(“Save”,Command.SCREEN,1);
    formedit.append(txteditquestion);
    formedit.append(txteditA);
    formedit.append(txteditB);
    formedit.append(txteditC);
    formedit.append(txteditD);
    formedit.append(txteditanswer);
    formedit.addCommand(back);
    formedit.addCommand(save);
    formedit.setCommandListener(this);

    //Formdelete
    formdelete= new Form(“Form Delete Record By ID”);
    txtdelete= new TextField(“Enter Record ID:”,””,2,TextField.NUMERIC);
    delete= new Command(“Delete”,Command.SCREEN,1);
    formdelete.append(txtdelete);

    formdelete.addCommand(delete);
    formdelete.addCommand(back);
    formdelete.setCommandListener(this);
    // Form Play Game
    formquestion1= new Form(“Millionaire Game”);
    formquestion2= new Form(“Millionaire Game”);
    formquestion3= new Form(“Millionaire Game”);
    formquestion4= new Form(“Millionaire Game”);
    formquestion5= new Form(“Millionaire Game”);
    formquestion6= new Form(“Millionaire Game”);
    formresult = new Form(“Result”);
    select= new Command(“Select”,Command.SCREEN,1);
    nextquestion= new Command(“Next”,Command.SCREEN,1);
    start= new Command(“Startup”,Command.SCREEN,1);
    //Form show Records
    formshow = new Form(“Show Records”);

    // ChoiceGroup in formplay
    }
    public void startApp()
    {
    display=Display.getDisplay(this);
    display.setCurrent(form);
    }
    public void pauseApp()
    {

    }
    public void destroyApp(boolean unconditional)
    {
    notifyDestroyed();

    }
    public void commandAction(Command c, Displayable d)
    {
    //formadd

    if (d==formadd) {
    if(c==back) {
    display.setCurrent(form2);
    txtquestion.setString(“”);
    txtA.setString(“”);
    txtB.setString(“”);
    txtC.setString(“”);
    txtD.setString(“”);
    txtanswer.setString(“”);
    }
    //Creating recordstore
    if(c==add){
    OpenRecords(“myRecordStore”);

    // Writing Records
    WriteRecord(“What is the capital of Thailand?,A.Bangkok,B.Jakarta,C.Phnom Penh,D.Kuala Lumpur,Bangkok”);
    WriteRecord(“What is the capital of Cambodia?,A.Bangkok,B.Phnom Penh,C.Jakarta,D.Hanoi,Phnom Penh”);
    WriteRecord(“What is the capital of Vietnam?,A.Hanoi,B.Jakarta,C.Tokyo,D.Kabul,Hanoi”);
    WriteRecord(“What is the capital of Japan?,A.Beijing,B.Tokyo,C.Hong Kai Do,D.Bangkok,Tokyo”);
    WriteRecord(“What is the capital of Oman?,A.Doha,B.Ankara,C.Kabul,D.Muscat,Muscat”);
    WriteRecord(“What is the capital of Lao?A.,Amman,B.Astana,C.Vietiane,D.kuwaii,Vietiane”);

    // add String from TextField.
    // try{
    String Data=”” ;
    Data= Data + txtquestion.getString() + “,”;
    Data= Data + txtA.getString() + “,”;
    Data= Data + txtB.getString() + “,”;
    Data= Data + txtC.getString() + “,”;
    Data= Data + txtD.getString() + “,”;
    Data= Data + txtanswer.getString();
    WriteRecord(Data);
    txtquestion.setString(“”);
    txtA.setString(“”);
    txtB.setString(“”);
    txtC.setString(“”);
    txtD.setString(“”);
    txtanswer.setString(“”);
    ReadRecord();
    CloseRecord();
    DeleteRecordstore(“myRecordStore”);
    }
    }
    //Form: Main Form
    if(d==form)
    {
    if(c==exit)
    {
    notifyDestroyed();
    destroyApp(false);
    }
    if(c==admin){
    display.setCurrent(form1);
    }
    if(c==play){

    String record1;
    record1= Vlist.elementAt(0).toString();
    String question=new String(record1.substring(0,record1.indexOf(‘,’)));
    String answer = new String(record1.substring(record1.indexOf(‘,’)+1));
    String answerA =new String( answer.substring(0,answer.indexOf(‘,’)));
    String answer1 =new String( answer.substring(answer.indexOf(‘,’)+1));
    String answerB= new String(answer1.substring(0,answer1.indexOf(‘,’)));
    String answer2 =new String( answer1.substring(answer1.indexOf(‘,’)+1));
    String answerC= new String(answer2.substring(0,answer2.indexOf(‘,’)));
    String answer3 =new String( answer2.substring(answer2.indexOf(‘,’)+1));
    String answerD=new String( answer3.substring(0,answer3.indexOf(‘,’)));
    String answer4 = new String(answer3.substring(answer3.indexOf(‘,’)+1));

    // Add Record into ChoiceGroup : record1
    cgplay= new ChoiceGroup(question.toString(),Choice.EXCLUSIVE);
    int cgdefault= cgplay.append(answerA.toString(), null);
    cgplay.append(answerB.toString(), null);
    cgplay.append(answerC.toString(), null);
    cgplay.append(answerD.toString(), null);
    cgplay.setSelectedIndex(cgdefault,true);
    formquestion1.append(cgplay);
    formquestion1.addCommand(select);
    formquestion1.setCommandListener(this);
    display.setCurrent(formquestion1);
    }
    }
    // Form1:Admin
    if(d==form1)
    {
    if(c==back) {
    display.setCurrent(form);
    }
    if(c==login)
    {
    if(txtpassword.getString().equals(“1234”)) {
    alert= new Alert (“Successful”,”Log in Successfull”, null , null);
    display.setCurrent(alert , form2);
    txtpassword.setString(“”);
    }

    else {
    alert = new Alert (“Failure”, “Log in fail, Log in again !” , null, null);
    display.setCurrent(alert , form1);
    txtpassword.setString(“”);
    }
    }
    }
    //form2
    if(d==form2)
    {
    if(c==menu){
    display.setCurrent(form);
    }
    if (c==add){
    display.setCurrent(formadd);
    }
    if(c==viewQuestion){
    display.setCurrent(listedit);

    }
    }
    // Form Edit
    if(d==listedit)
    {
    if(c==back)
    { display.setCurrent(form2);}
    if(c==edit)
    {
    // Cut String into Formedit to update
    int index= listedit.getSelectedIndex();
    String part = listedit.getString(index);
    // final int k= part.indexOf(‘,’);
    String question=part.substring(0,part.indexOf(‘,’));
    String answer = part.substring(part.indexOf(‘,’)+1);
    String answerA = answer.substring(0,answer.indexOf(‘,’));
    String answer1 = answer.substring(answer.indexOf(‘,’)+1);
    String answerB= answer1.substring(0,answer1.indexOf(‘,’));
    String answer2 = answer1.substring(answer1.indexOf(‘,’)+1);
    String answerC= answer2.substring(0,answer2.indexOf(‘,’));
    String answer3 = answer2.substring(answer2.indexOf(‘,’)+1);
    String answerD= answer3.substring(0,answer3.indexOf(‘,’));
    String answer4 = answer3.substring(answer3.indexOf(‘,’)+1);
    // System.out.println( answer4);
    // Store in TextField to update
    txteditquestion.setString(question);
    txteditA.setString(answerA);
    txteditB.setString(answerB);
    txteditC.setString(answerC);
    txteditD.setString(answerD);
    txteditanswer.setString(answer4);
    display.setCurrent(formedit);
    }
    // Delete Record
    if(c==delete)
    {
    OpenRecords(“myRecordStore”);
    // display.setCurrent(formdelete);
    int index;
    index= listedit.getSelectedIndex();
    listedit.delete(index);
    DeleteRecord(index+1);
    alert=new Alert(“Delete Record”,”Deleting”,null,null);
    display.setCurrent(alert);
    ReadRecord();
    display.setCurrent(listedit);
    CloseRecord();
    }

    }
    if(d==formedit) {
    if(c==back){
    display.setCurrent(listedit);
    }
    if(c==save) {
    OpenRecords(“myRecordStore”);
    //boolean updatestatus= false;
    String data1=””;

    try{

    data1+=txteditquestion.getString()+”,”;
    data1+=txteditA.getString() + “,”;
    data1+=txteditB.getString() + “,”;
    data1+=txteditC.getString() + “,”;
    data1+=txteditD.getString() + “,”;
    data1+=txteditanswer.getString();
    byte[] rec = data1.getBytes();
    // int index =0;
    int index= listedit.getSelectedIndex();
    rs.setRecord(index+1, rec, 0, rec.length);

    //updatestatus=true;
    alert = new Alert(“Update Record”,”Updating …”,null,null);
    //Read again to Listedit after updating ……

    // ReadRecord();
    try{

    listedit= new List(“List Edit Records “, List.IMPLICIT);
    for (int i = 1; i win)
    {
    alert=new Alert(“Millionaire Game”,”You are LOSE”,null,null);
    }
    else if(win>lose){
    alert=new Alert(“Millionaire Game”,”You are WIN”,null,null);
    }
    alert.setTimeout(3000);
    display.setCurrent(alert,form);
    //display.setCurrent(form);
    }
    }
    }
    public void OpenRecords(String nameRecordStore)
    {
    try{
    rs=RecordStore.openRecordStore(nameRecordStore, true);
    } catch(Exception error) {
    alert= new Alert(“Error opening”, error.toString(),null, AlertType.WARNING);
    alert.setTimeout(Alert.FOREVER);
    display.setCurrent(alert);
    }
    }
    public void WriteRecord(String st)
    {
    // OpenRecords(“myRecordStore”);
    try{
    byte[] outputRecord = st.getBytes();
    rs.addRecord(outputRecord, 0, outputRecord.length);
    alert= new Alert(“Writing”, st,null,null);
    display.setCurrent(alert);
    }catch(Exception error) {
    alert = new Alert(“Error Writing”,error.toString(), null, AlertType.WARNING);
    alert.setTimeout(Alert.FOREVER);
    display.setCurrent(alert);
    }
    }

    public void ReadRecord()
    {
    try
    {
    byte[] recData = new byte[7];
    int len;
    for (int i = 1; i recData.length){
    recData = new byte[rs.getRecordSize(i)];
    }
    len = rs.getRecord(i, recData, 0);
    listedit.append(new String(recData,0,len),null);
    Vlist.addElement(new String(recData,0,len));
    }
    listedit.addCommand(back);
    listedit.addCommand(edit);
    listedit.addCommand(delete);
    listedit.setCommandListener(this);

    }catch(Exception e)
    {
    alert = new Alert(“Error Readinging”, e.toString(), null, AlertType.WARNING);
    alert.setTimeout(Alert.FOREVER);
    display.setCurrent(alert);
    }
    }

    public void DeleteRecord(int indexRecord)
    {
    try{
    rs.deleteRecord(indexRecord);
    rs.getVersion();
    }catch(Exception error){
    alert = new Alert(“Error Deleting”, error.toString(), null, AlertType.WARNING);
    alert.setTimeout(Alert.FOREVER);
    display.setCurrent(alert);
    }
    }

    public void UpdateRecord(String st, int index)
    {
    //boolean updatestatus= false;
    try{

    byte[] rec = st.getBytes();

    rs.setRecord(index, rec, 0, rec.length);
    // updatestatus=true;
    rs.getVersion();
    alert = new Alert(“Update Record”,”Updating …”,null,null);
    display.setCurrent(alert);
    ReadRecord();
    }catch (Exception e){
    //updatestatus=false;
    alert = new Alert(“Error updating ” ,e.toString(),null,null);
    display.setCurrent(alert);
    }
    }

    public void CloseRecord()
    {
    try {
    rs.closeRecordStore();
    } catch (Exception error) {
    alert = new Alert(“Error Closing”, error.toString(), null, AlertType.WARNING);
    alert.setTimeout(Alert.FOREVER);
    display.setCurrent(alert);
    }
    }
    public void DeleteRecordstore(String nameRecordStore)
    {
    try{
    if (RecordStore.listRecordStores() != null){

    RecordStore.deleteRecordStore(nameRecordStore);
    }
    }catch (Exception e)
    {
    alert = new Alert(“Error Deleting RecordStore”, e.toString(), null, AlertType.WARNING);
    alert.setTimeout(Alert.FOREVER);
    display.setCurrent(alert);
    }
    }
    public void ReadFormVector(int index){
    String record1;
    record1= Vlist.elementAt(index).toString();

    //System.out.println(record1);
    //final int k= record1.indexOf(‘,’);
    String question=new String(record1.substring(0,record1.indexOf(‘,’)));
    String answer = new String(record1.substring(record1.indexOf(‘,’)+1));
    String answerA =new String( answer.substring(0,answer.indexOf(‘,’)));
    String answer1 =new String( answer.substring(answer.indexOf(‘,’)+1));
    String answerB= new String(answer1.substring(0,answer1.indexOf(‘,’)));
    String answer2 =new String( answer1.substring(answer1.indexOf(‘,’)+1));
    String answerC= new String(answer2.substring(0,answer2.indexOf(‘,’)));
    String answer3 =new String( answer2.substring(answer2.indexOf(‘,’)+1));
    String answerD=new String( answer3.substring(0,answer3.indexOf(‘,’)));
    String answer4 = new String(answer3.substring(answer3.indexOf(‘,’)+1));
    }
    }

  42. السلام عليكم ممكن احد يرسلي كود عمل برنامج مواقيت الصلاة بالاندرويد بحيث يرن قبل الصلاة بخمس دقائق ويؤشر على اقرب جامع لي؟ جعلها الله في ميزان حسناتكم امين

اترك رداً على م. وائل حسن-أبوإياس الظاهري إلغاء الرد