اذهب إلى المحتوى

لوحة المتصدرين

  1. Lujain Maaz

    Lujain Maaz

    الأعضاء


    • نقاط

      41

    • المساهمات

      344


  2. محمد طاهر5

    محمد طاهر5

    الأعضاء


    • نقاط

      1

    • المساهمات

      247


  3. Mohamed Ibrahim36

    Mohamed Ibrahim36

    الأعضاء


    • نقاط

      1

    • المساهمات

      38


المحتوى الأكثر حصولًا على سمعة جيدة

المحتوى الأعلى تقييمًا في 11/14/15 في كل الموقع

  1. يتم إنشاء تطبيق Applet في جافا بواسطة عمل extends للصف Applet Class من الصف الجديد الخاص بالتطبيق. عليك أولًا إنشاء مشروع جافا جديد java project في eclipse قم باختيار java project من القائمة File->New -> Java Project. ثم اكتب اسم المشروع واضغط على زر Finish. الآن أضف صف class جديد بالضغط على الزر اليميني لاسم المشروع AppletExample واختيار Add->New->Class ثم قم بتسميته وليكن myApplet مثلًا، أصبح لدينا صف جديد myApplet ولكن لم نقم بإنشاء تطبيق Applet بعد. الخطوة الأخيرة هي عمل Extends للصف Applet من الصف myApplet، يجب أولًا عمل تضمين import للمكتبة java.applet على الشكل التالي: import java.applet.Applet;أصبح الآن كل شيء جاهز لتشغيل تطبيق Applet ولكن بقي أمر أخير ومهم وهو الدالة init() هذه الدالة هي النقطة التي ينطلق منها تطبيق Applet بحيث أنها أول دالة تنفّذ عند تشغيل التطبيق. مثلًا سأقوم بعرض Label وجملة Hello World! في الدالة init() لتظهر عند تشغيل التطبيق لتكون الشيفرة البرمجية على الشكل التالي: import java.applet.Applet; import javax.swing.JLabel; public class myApplet extends Applet { public void init() { this.add(new JLabel("Hello World!")); } }
    4 نقاط
  2. توفر تقنية MD5 إمكانية تشفير النصوص بطريقة لا يمكن فيها الرجوع للنص الأصلي بحيث تتم المقارنة بين النصوص بعد التشفير ولا يتم التعامل مع النصوص بصيغتها الأصلية. يتم تشفير النصوص باستخدام الصف MD5 في C# وإنشاء غرض منه من النوع MD5CryptoServiceProvider: كما في المثال التالي: MD5 md5 = new MD5CryptoServiceProvider();ومن ثم استدعاء الدالة CopmuteHash وتمرير معامل Argument وهو النص المراد تشفيره باستخدام ASCIIEncoding.ASCII.GetBytes(text). //compute hash from the bytes of text md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(text)); بعد ذلك قم بأخذ القيمة من الغرض md5 عن طريق الدالة Hash حيث أن القيمة المرتجعة هي عبارة مصفوفة من byte. byte[] result = md5.Hash;في النهاية أنشئ StringBuilder واعمل append للنتيجة كما في المثال التالي: public static string MD5Hash(string text) { MD5 md5 = new MD5CryptoServiceProvider(); //compute hash from the bytes of text md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(text)); //get hash result after compute it byte[] result = md5.Hash; StringBuilder strBuilder = new StringBuilder(); for (int i = 0; i < result.Length; i++) { //change it into 2 hexadecimal digits //for each byte strBuilder.Append(result[i].ToString("x2")); } return strBuilder.ToString(); } تشفير نصوص باستخدام MD5
    3 نقاط
  3. يُستخدم العنصر Calender لعرض التقاويم الميلادية والهجرية حيث تحوي calneder على عدد كبير من الخصائص مثل تحديد اليوم الأول من الأسبوع باستخدام الخاصية FirstDayofWeek والتي تأخذ قيم: Sunday|Monday|Tusday|Wedensday|Thursday|Friday. والخاصية DayNameFormat تحدد طريقة عرض اليوم (اسم كامل،الحرف الأول فقط...الخ) حيث تأخذ قيم: Full|Short|FirstLetter|FirstTwoLett|Shortest. لإنشاء calender في asp.net نكتب: <asp:Calendar id="calendar1" runat="server"></asp:Calender> يمكن تغيير لون الأيام في الـcalender بحسب نوعها، مثلًا تلوين أول يوم من أيام الأسبوع بلون معين: <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>ASP.NET Example</title> </head> <body> <form id="form1" runat="server"> <asp:Calendar id="calendar1" runat="server"> <OtherMonthDayStyle ForeColor="LightGray"> </OtherMonthDayStyle> <TitleStyle BackColor="Blue" ForeColor="White"> </TitleStyle> <DayStyle BackColor="gray"> </DayStyle> <SelectedDayStyle BackColor="LightGray" Font-Bold="True"> </SelectedDayStyle> </asp:Calendar> </form> </body> </html> لعلّ الدالة onDayRender هي أهم دالة في Calender حيث أنها تُنفذ عند إنشاء وإظهار Calender، يمكن الاستفادة من الدالة onDayRender في الكثير من المهام. كمثال يمكن تلوين أيام العطل الرسمية بلون معين وكذلك تغيير ألوان أيام شهر معين..الخ. مثال: <html> <head> <title>DayRender Event Example</title> <script language="C#" runat="server"> void DayRender(Object source, DayRenderEventArgs e) { // Change the background color of the days in the month // to yellow. if (!e.Day.IsOtherMonth && !e.Day.IsWeekend) e.Cell.BackColor=System.Drawing.Color.Yellow; // Add custom text to cell in the Calendar control. if (e.Day.Date.Day == 18) e.Cell.Controls.Add(new LiteralControl("<br />Holiday")); } </script> </head> <body> <form id="form1" runat="server"> <h3>DayRender Event Example</h3> <asp:Calendar id="calendar1" OnDayRender="DayRender" runat="server"> <WeekendDayStyle BackColor="gray"> </WeekendDayStyle> </asp:Calendar> </form> </body> </html> كيف أتعامل مع Calendar في Asp.Net؟
    3 نقاط
  4. يمكن تغيير قيمة cookie في JQuery بالطريقة التالية: $.cookie("Key", Value);حيث تتغير قيم الـ value اعتمادًا على الـ key يمكن أيضًا إضافة صلاحية للـ Cookie باستخدام expires كما في المثال: $.cookie("test", 1, { expires : 10 });ملاحظة: عند استخدام expires لـ Cookie تصبح عبارة عن session Cookie. لحذف الـ Cookie في JQuery تستخدم removeCookie: $.removeCookie("test");لأخذ قيمة Cookie في JQuery نكتب: var cookieValue = $.cookie("test");توفر أيضًا setCookie و getCookie إمكانية لتغيير أو أخذ قيمة Cookie: setCookie('test','1');getCookie('test');تستخدم Cookie في مواقع الويب لتخزين معلومات الزوار مثلًا اللغة التي اختارها في الموقع أو اللون، هناك أغراض كثيرة لاستخدام الـ Cookies وكلها تتعلق بمساعدة موقع الويب في تذكر المستخدمين. كيف أعدّل على cookie باستخدام JQuery؟
    3 نقاط
  5. تُعدّ Grid Layout من أكثر النماذج استخدامًا في ترتيب العناصر ضمن واجهات تطبيقات جافا وذلك بسبب مرونتها الكبيرة وسهولة توضع العناصر بأي طريقة يرغب المبرمج أن يظهر الواجهة بها. يتم إنشاء Grid Layout عن طريق إنشاء غرض من الصف GridLayout وتمرير معاملين في المُنشئ Constructor هما عدد الأسطر وعدد الأعمدة. يمكن إنشاء Grid Layout في المُنشئ Constructor الخاص بالغرض JPanel كما في المثال التالي: JPanel panel = new JPanel(new GridLayout(2,2));ومن ثم إضافة JPanel إلى واجهة التطبيق JFrame. لنفرض أننا نريد صنع نموذج لحاسبة ونريد إنشاء مجموعة من الأزرار من 0-9 وأزرار العمليات الأربع (+,-,/,*) وزر مسح clear باستخدام GridLayout، وإضافة حقل JTextField في بداية الواجهة. import javax.swing.*; import java.awt.*; import java.awt.event.*; public class GridLayoutExample extends JFrame { JPanel panelTxt = new JPanel(new BorderLayout()); JPanel panel = new JPanel(new GridLayout(4,4)); JTextField txtField = new JTextField(); JButton btnPlus = new JButton("+"); JButton btnMinus = new JButton("-"); JButton btnDivid = new JButton("/"); JButton btnMultiply = new JButton("*"); JButton btnClear = new JButton("C"); public GridLayoutExample() { for(int i=0; i<10; i++) { JButton btn = new JButton(i+""); panel.add(btn); } panel.add(btnPlus); panel.add(btnMinus); panel.add(btnDivid); panel.add(btnMultiply); panel.add(btnClear); txtField.setPreferredSize(new Dimension(20, 100)); panelTxt.add(txtField,BorderLayout.NORTH); panelTxt.add(panel,BorderLayout.CENTER); this.add(panelTxt); setSize(500, 500); setVisible(true); setTitle("Grid Layout Example"); } public static void main(String[] args) { JMenuExample test = new JMenuExample(); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }عند إضافة العناصر إلى GridLayout فإن كل عنصر يأخذ ترتيبه بشكل تلقائي ابتداءً من الخلية 0. يمكنك تحديد رقم الخلية الذي تود وضع العنصر فيها بواسطة المعامل الثاني للدالة add وهي index حيث يوضع فيه رقم الخلية مثال: panel.add(btnPlus,5);أي أنه سيتم وضع الزر الخاص بعملية الجمع في الخانة رقم 5. كيف أتعامل مع Grid Layout في جافا swing؟
    3 نقاط
  6. تُعتبر مكتبة Swing أحد المكتبات التي توفر عناصر controls لبناء واجهة تطبيق رسومية في تطبيقات جافا. لإنشاء تطبيق واجهة رسومي في جافا عليك أولًا بإنشاء مشروع جديدعلى أحد الـ IDEs التي تدعم البرمجة بلغة جافا مثل NetBeans و Eclipse. بعد ذلك أضف صف جديد Class إلى المشروع وقم بتسميته myJavaApp مثلًا. الخطوة الأساسية لبناء واجهة تطبيق هي عمل وراثة Extends للصف JFrame من الصف الجديد الذي قمت بإنشائه. يعتبر الصف JFrame أحد أهم الصفوف في Swing حيث لا يمكن إظهار الواجهة بدونه. الآن قم بتحديد خصائص الواجهة JFrame مثل الطول والعرض ومكان ظهورها على الشاشة عند تشغيل التطبيق وكذلك عنوان الواجهة Title. ملاحظة: لا يمكن للـ Frame أن يظهر بدون استدعاء الدالة setVisible وإعطاءها قيمة true. import javax.swing.*; import java.awt.*; import java.awt.event.*; public class myFrame extends JFrame { public myFrame() { } public static void main(String[] args) { myFrame test = new myFrame(); test.setSize(500, 500); test.setTitle("JFrame Example"); test.setVisible(true); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }واجهة التطبيق JFrame:
    2 نقاط
  7. يُعتبر تطبيق telegram أحد تطبيقات المحادثات الذي أخذ بالانتشار الكبير في الآونة الأخيرة نظرًا للميزات الجديدة التي يتمتع بها كالسرعة وميزة Telegram Bots بالإضافة لميزة العدد غير المحدود للأعضاء في المجموعة الواحدة Group ما جعله يتفوق على نظيره Whatsapp. يمكن تعريف telegram bots بأنها برمجيات تشبه لحد ما البرامج الذكية كالروبوت، حيث أنها تستجيب لأوامر معينة من المستخدم لتقديم خدمات تمكّن المشتركين من الاستفادة منها عن طريق إضافة حساب الـ bot بواسطة البحث عنه واختياره ليظهر في قائمة المحادثة ومن ثم التواصل معه بواسطة أوامر. الخدمات التي تقدمها telegram bots معرفة أسعار العملات وحالات الطقس والكثير. مثلًا BotForTelgram هو أحد الـ bot المشهورة في تلغرام وهو روبوت يقوم بالاستجابة لعدة أوامر مثل أمر !help لعرض قائمة بجميع الأوامر المستخدمة في تطبيق تلغرام. والأمر !Weather الذي يمكنك من معرفة حالة الطقس في مدينة معينة. ماهو bots في تلغرام؟
    2 نقاط
  8. عليك أولًا أن تقوم بتطبيق حدث addActionListener على الزر append يقوم هذا الحدث بتنفيذ الدالة actionPerformed عند الضغط على زر append. لاستخدام الصف ActionListener قم بتضمين المكتبتين ActionEvent و ActionListener import java.awt.event.ActionEvent; import java.awt.event.ActionListener;تطبيق الحدث addActionListener على الزر append وعمل إعادة تعريف override للدالة actionPerformed كما في المثال التالي: button1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { txtArea.append("\n"+txtField.getText()); } });في الحدث actionPerformed نستدعي الدالة append ونمرر قيمة الحقل JTextField عن طريق الدالة getText() ليكون المثال على الشكل التالي: import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import java.awt.*; import java.awt.event.*; public class ActionListenerExample extends JFrame { JButton button1 = new JButton("append"); JTextArea txtArea = new JTextArea(50,20); JPanel panel = new JPanel(new FlowLayout()); JTextField txtField = new JTextField(20); public ActionListenerExample() { panel.add(button1); panel.add(txtField); panel.add(txtArea); button1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { txtArea.append("\n"+txtField.getText()); } }); this.add(panel); setSize(500, 500); setVisible(true); } public static void main(String[] args) { JMenuExample test = new JMenuExample(); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } أنشئنا JPanel وأضفنا العناصر إليها ثم أضفناها إلى JFrame باستخدام الدالة this.add(). عند كتابة نص في الحقل والضغط على زر append يظهر النص على TextArea:
    2 نقاط
  9. تُمكّنك JList من عرض قائمة من العناصر مع إمكانية وضع شريط تمرير scrollBar. تختلف JList عن باقي الـ Collections إذ أنه لا توجد طريقة مباشرة لتعبئتها مثلًا باستخدام الدالة add(). يجب أولًا قبل تعبئة JList أن نُنشئ مصفوفة array وتعبئتها بالعناصر المطلوبة ومن ثم تقوم بإعطاء المصفوفة للـ JList في الـConstructor. مثال: JList list; String[] listColorNames = { "black", "blue", "green", "yellow", "white" };عند إنشاء الغرض JList نمرر المصفوفة في الـConstructor كما في المثال التالي: list = new JList(listColorNames);يوفر الصف JList تحديد نمط الاختيار من القائمة (اختيار أحادي Single Selection أو اختيار ثنائي Multiple Selection) باستخدام الدالة setSelectionMode كما في المثال التالي: list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);المثال التالي يشرح طريقة التعامل مع JList وطريقة تطبيق حدث action Listener لأخذ قيمة العنصر المحدد من JList. مثلًا مصفوفة تحوي على أسماء عدد من الألوان لكل لون قيمة هي قيمة اللون لنرى كيفية أخذ قيمة عنصر اللون وتلوين الخلفية باللون المحدد: import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import java.awt.*; import java.awt.event.*; public class JMenuExample extends JFrame { JList list; String[] listColorNames = { "black", "blue", "green", "yellow", "white" }; Color[] listColorValues = { Color.BLACK, Color.BLUE, Color.GREEN, Color.YELLOW, Color.WHITE }; Container contentpane; public JMenuExample() { super("List Source Demo"); contentpane = getContentPane(); contentpane.setLayout(new FlowLayout()); list = new JList(listColorNames); list.setSelectedIndex(0); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); contentpane.add(new JScrollPane(list)); list.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { contentpane.setBackground(listColorValues[list .getSelectedIndex()]); } }); setSize(500, 500); setVisible(true); } public static void main(String[] args) { JMenuExample test = new JMenuExample(); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }عند اختيار اللون Blue مثلًا: كيف أضيف عناصر إلى JList في جافا swing؟
    2 نقاط
  10. تعتبر Border Layout أحد النماذج التي تُرتب وفقها العناصر في مكتبة awt في جافا، والتي تأخذ خمس جهات لتموضع العناصر بداخلها : NORTH, SOUTH, EAST, WEST, CENTER غالبًا تُستخدم عند إنشاء تطبيقات تحتوي على قائمة في الأعلى ومساحة عمل في الوسط وقوائم جانبية. لإنشاء Border Layout نقوم بإنشاء غرض من الصف Border Layout كما في الشيفرة التالية: BorderLayout brLayout = new BorderLayout();يجب عمل تضمين import للمكتبة awt.BorderLayout كالتالي: import java.awt.BorderLayout;لتوضيح كيفية تموضع العناصر في Border Layout الشكل التالي: لنفرض أننا نريد عمل تطبيق يحوي على قائمة menu في الأعلى و Text Area في الوسط والتي ستمثل مساحة العمل. في الأسفل سيكون لدينا statusBar وعلى الجانبين قائمتين عموديتين بمجموعة عناصر. سيكون المثال على الشكل التالي: import java.awt.BorderLayout; import javax.swing.*; public class JMenuExample { public static void main(String[] args) { JFrame frame = new JFrame("BorderLayoutExample"); BorderLayout brLayout = new BorderLayout(); JPanel panel =new JPanel(new BorderLayout()); JMenuBar mb = new JMenuBar(); JMenu m1 = new JMenu("File"); JMenu m2 = new JMenu("Edit"); JMenuItem mItem1 = new JMenuItem("New"); JMenuItem mItem2 = new JMenuItem("Save"); JMenuItem mItem3 = new JMenuItem("Save As"); JMenuItem mItem4 = new JMenuItem("Close"); JTextArea txtArea = new JTextArea("Work area"); JButton b1 = new JButton("East Menu"); JButton b2 = new JButton("West Menu"); JLabel statusBar = new JLabel("statusBar"); m1.add(mItem1); m1.add(mItem2); m1.add(mItem3); m1.add(mItem4); mb.add(m1); mb.add(m2); panel.add(mb, BorderLayout.NORTH); panel.add(txtArea, BorderLayout.CENTER); panel.add(b1, BorderLayout.EAST); panel.add(b2, BorderLayout.WEST); panel.add(statusBar, BorderLayout.SOUTH); frame.add(panel); frame.setSize(500, 500); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } كيف أستخدم border layout في جافا awt؟
    2 نقاط
  11. لا يكاد يخلو أي موقع ويب من وجود خرائط Google فمن خلال وضع خريطة على الموقع الخاص بك فإنك تعطي تأثيرًا غنيًا ومستوى أعلى للتفاعل بين المستخدمين. سأقوم في هذا المقال بشرح كيفيّة استخدام خرائط غوغل وإضافتها إلى صفحة الويب بالإضافة إلى كيفيّة تحديد أكثر من موقع بنفس الوقت على نفس الخريطة، وشرح بعض المزايا الـتي يمكنك إضافتها إلى خريطتك. يمكنك تحميل الملف المصدري للمثال الموضح في هذا الدرس. إستخدام مكتبة Google APIمكتبة Google Maps API هي عبارة عن مكتبة جافاسكربت ولنتمكن من إستخدام مكتبة Google API قم بإضافة الـسكربت الـخاص بذلك. <script src ="http://maps.google.com/maps/api/js?sensor=false" type="text/javascript"></script> إنشاء الخريطةقم الآن بإنشاء div بالأبعاد الـتي تريد أن تظهر بها الـخريطة وقم بإعطاءه "id="map. <div id="map" style="width: 600px; height: 400px;" ></div>الآن لنقم بإنشاء السكربت لإظهار الخريطة، يجب عليك عند وضع أي خريطة أن تقوم بتحديد الإحداثيات: خط الطول longitude وخط العرض latitude ضمن الخاصية center. يمكنك معرفة الإحداثيات لمنطقة ما بالدخول لموقع LatLong وكتابة اسم المدينة أو المنطقة. في هذا المثال ستعرض الخريطة موقع تركيا Turkey. لنقم الآن ضمن الدالة {} ()function initialize، بتحديد خصائص الـخريطة ضمن الـمتغير mapProp، مثل: الموقع الذي سيظهر عند تحميلها، نوعها، وحجم الـتكبير الذي نريده zoom. كما هو موضح في الـكود الـتالـي: <script type="text/javascript"> function initialize() { var mapProp = { center: new google.maps.LatLng(38.963745, 35.243322), zoom: 5, mapTypeId: google.maps.MapTypeId.ROADMAP }; } </script> نستخدم الخاصية zoom لتحديد البعد الذي نريده للمكان (قريب – بعيد).الخاصية mapTypeId تحدد نوع الخريطة الذي سيظهر:ROADMAP ( الخريطة العادية 2D map)SATELLITE (خريطة مصورة)HYBRID (خريطة مصورة بالإضافة الى أسماء الطرق والمدن)TERRAIN (خريطة تتضمن الجبال والأنهار…الـخ)لنقم الآن بتعريف متغير map وإعطاءه id الخاصة بالـ div: var map = new google.maps.Map(document.getElementById("map"), mapProp);ثم إضافة الحدث DOM listener الذي يقوم بتنفيذ الدالة ()initialize عند تحميل صفحة الويب: google.maps.event.addDomListener(window, 'load', initialize);ليصبح الكود على هذا الشكل: <script type="text/javascript"> function initialize() { var mapProp = { center: new google.maps.LatLng(38.963745, 35.243322), zoom: 5, mapTypeId: google.maps.MapTypeId.ROADMAP }; var map = new google.maps.Map(document.getElementById("map"), mapProp); } google.maps.event.addDomListener(window, 'load', initialize); </script>ستظهر لك الخريطة بهذا الشكل: وضع محددات Markersإضافة محدد واحدلنقم الآن بتحديد موقع معين ووضع محدد (marker). أولًا قم بتعريف مصفوفة تحتوي على الإحداثيات (خط الـطول وخط الـعرض) للمدينة أو البلد أو الموقع المعين الذي تريد تحديده. مثلًا مدينة اسطنبول Istanbul: var myLatLng = {lat: 41.008238, lng: 28.978359 };هنا سأقوم بإضافة محدد واحد ثم سأشرح كيف يمكننا إضافة أكثر من محدد. الآن نعطي للخاصية center الـمتغير myLatLng: var map = new google.maps.Map(document.getElementById('map'), { zoom: 8, center: myLatLng });ثم نقوم بتعريف الـمحدد وإعطاء للخاصية position الـمتغير myLatLng: var marker = new google.maps.Marker({ position: myLatLng, map: map, title: 'Hello World!' });سيظهر بهذا الشكل: إضافة أكثر من محدد على نفس الـخريطةقم بتعريف مصفوفة تحتوي على إحداثيات المواقع الـتي تود تحديدها، سأقوم بتحديد 6 مدن: Istanbul, Antalya, Ankara, Trabzon, Bursa, Adana كما هو موضح أدناه: var myLocations = [ ['Istanbul', 41.008238, 28.978359, 1], ['Antalya', 36.896891, 30.713323, 2], ['Ankara', 39.933363, 32.859742, 3], ['Trabzon', 41.002697, 39.716763, 4], ['Bursa', 40.188528, 29.060964, 5], ['Adana', 36.991419, 35.330829, 6] ];الآن عند تعريف المحدد قم بعمل for loop حلقة تكرار وتعريف متغير i ومن ثم إعطاء الـمصفوفة myLocations للخاصية position: var marker, i; for (i = 0; i < myLocations.length; i++) { marker = new google.maps.Marker({ position: new google.maps.LatLng(myLocations[i][1], myLocations[i][2]), map: map }); }وهذه هي المواقع التي قمنا بتحديدها: وضع محدد مع لصيقة (label) عند الـنقر على مكان معينسأقوم هنا بشرح فكرة عن الـevents في Google map ثم سأتطرق فيما بعد لشرح الـevents بالتفصيل في مقال مقبل إن شاء الله. الآن لنرى كيف يمكننا عند الضغط على مكان معين على الخريطة إظهار محدد مع لصيقة. مثال: marker A, marker B. أولاً يجب تعريف متغير Labels نضع فيه القيم الـتي نريد إظهارها في اللصيقة. مثال: الأحرف من A-Z. ونحتاج أيضًا إلى تعريف متغير labelIndex لتحديد الـقيمة الـتي نريد إظهارها. var labels = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; var labelIndex = 0;الآن قم بتحديد المكان الـذي ستفتح عنده الخريطة. مثال: تركيا. var Turkey = { lat: 38.963745 , lng: 35.243322 }; var map = new google.maps.Map(document.getElementById('map'), { zoom: 12, center: Turkey });الدالة ()addMarkerيقوم الحدث event.addListener باستدعاء التابع ()addMarker عند الضغط على الخريطة. كما في المثال التالي: google.maps.event.addListener(map, ‘click’, function(event) { addMarker(event.latLng, map); });وليكون هناك marker محدد عند فتح الخريطة قم بإضافة محدد إلى Turkey: addMarker(Turkey, map);لنكتب الآن الدالة ()addMarker: نحتاج لتعريف 2 parameters (معاملين) هما الـخريطة والـموقع map & location ثم نقوم بتعريف marker وإعطاء المعامل location للخاصية position. ولإظهار label نقوم بإعطاء الـمتغير labels الـذي يحتوي على الأحرف من A-Z للخاصية label مع تحديد ++index لكي ينتقل عند كل نقرة جديدة لحرف جديد وإظهاره على الـ marker كما هو موضح في الكود الـتالي: function addMarker(location, map) { var marker = new google.maps.Marker({ position: location, label: labels[labelIndex++ % labels.length], map: map }); }ستظهر لك الخريطة بهذا الشكل: وعند النقر على الخريطة: إضافة تأثير Marker Animationيمكنك إضافة تأثير حركي على المحدد ليبدو وكأنه يقفز ، فقط باستخدام خاصية animation:google.maps.Animation.BOUNCE كما هو موضح في الكود الـتالـي: var marker = new google.maps.Marker({ position: myCenter, animation: google.maps.Animation.BOUNCE });إضافة أيقونة للمحدد يمكنك تغيير الأيقونة الخاصة بالمحدد ووضع أيقونة من اختيارك عن طريق الخاصية icon، حيث تقوم بإعطاء مسار الصورة للخاصية icon. كما هو موضح في الكود التالي: var marker = new google.maps.Marker({ position: myCenter, icon:'pin.png' });ستظهر لك الخريطة بهذا الشكل: إضافة شكل متعدد الخطوط Polyline تتيح لك ميزة polyline رسم خط يصل بين سلسلة إحداثيات على الخريطة بشكل متسلسل، على سبيل المثال يمكنك رسم مسار رحلة عبر مجموعة من المدن ويمكنك التحكم بخصائص عديدة للخط مثل اللون والشفافية والحجم. خصائص الميزة Polyline: path - تحدد مجموعة الإحداثيات التي سيمر بها الخط.strokeColor - يحدد لون الخط بالـHex كود.strokeOpacity - يحدد شفافية الخط بين 0.0 و 1.0.strokeWeight - يحدد عرض الخط بالبكسل.Editable - تحدد ما إذا كان الخط قابل للتعديل من قبل المستخدم أم لا. لنقم الآن بتحديد مجموعة إحداثيات لمدن ونصل فيما بينها عن طريق polyline، سأستخدم نفس الإحداثيات التي استخدمتها في تحديد المدن عندما وضعت أكثر من محدد، سأقوم برسم خط بين ثلاث مدن: اسطنبول، انطالـيا، طرابزون. أولاً: تحديد إحداثيات الـمدن: var istanbul = new google.maps.LatLng(41.008238, 28.978359); var antalya = new google.maps.LatLng(36.896891, 30.713323); var trabzon = new google.maps.LatLng(41.002697, 39.716763);ثانيًا: نقوم بتعريف مصفوفة myTrip وتعبئتها بأسماء المتغيرات (المدن الـتي نريد تحديد المسار عليها ): var myTrip = [ istanbul, antalya, trabzon];وثم نعطي المصفوفة للخاصية path: path: myTrip,ثالثًا: نقوم بتعريف متغير flightPath لاختيار الـخاصية polyline: كما هو موضح في الكود الـتالي: var map = new google.maps.Map(document.getElementById(“map”),mapProp); var myTrip = [ istanbul, antalya, trabzon]; var flightPath = new google.maps.Polyline({ path:myTrip, strokeColor: "#0000FF", strokeOpacity: 0.8, strokeWeight: 2 }); flightPath.setMap(map); }ستظهر لك الخريطة بهذا الشكل: إضافة مضلع Polygonتتيح لك هذه الـميزة إنشاء مضلع تكون زواياه عبارة عن سلسلة الإحداثيات التي تريد الوصل بينها. لا تختلف ميزة polygon كثيراً عن polyline من حيث كتابة الـتعليمات فقط نقم باستبدالـ polyline بـpolygon. خصائص الـميزة polygon: path - تحدد مجموعة الإحداثيات التي سيمر بها الخط.strokeColor - يحدد لون الخط بالـHex كود.strokeOpacity - يحدد شفافية الخط بين 0.0 و 1.0.strokeWeight - يحدد عرض الخط بالبكسل.fillColor - يحدد لون المضلع بالـHex كود.fillOpacity - يحدد نسبة الشفافية للمضلع بين 0.0 و 1.0.Editable - تحدد ما إذا كان الخط قابل للتعديل من قبل المستخدم أم لا. كما هو موضح في الكود التالي: var map = new google.maps.Map(document.getElementById(“map”),mapProp); var myTrip = [istanbul, antalya, trabzon]; var flightPath = new google.maps.Polygon({ path: myTrip, strokeColor: "#0000FF", strokeOpacity: 0.8, strokeWeight: 2 }); flightPath.setMap(map); }ستظهر لك الـخريطة بهذا الـشكل: إضافة دائرة Circleتتيح لك هذه الميزة إحاطة منطقة معينة على الخريطة بدائرة، يمكنك التحكم بقطر الدائرة ولونها وشفافيتها. خصائص الميزة Circle: center - تحديد إحداثيات مركز الدائرة. radius - تحديد قطر الدائرة بالمتر المربع. strokeColor - يحدد لون الخط بالـHex كود.strokeOpacity - يحدد شفافية الخط بين 0.0 و 1.0.strokeWeight - يحدد عرض الخط بالبكسل.fillColor - يحدد لون المضلع بالـHex كود.fillOpacity - يحدد نسبة الشفافية للمضلع بين 0.0 و 1.0.Editable - تحدد ما إذا كان الخط قابل للتعديل من قبل المستخدم أم لا.كما هو موضح في الكود التالي: var map = new google.maps.Map(document.getElementById(“map”), mapProp); var flightPath = new google.maps.Circle({ center: istanbul, radius: 20000, strokeColor: "#0000FF", strokeOpacity: 0.8, strokeWeight: 2, fillColor: "#0000FF", fillOpacity: 0.4 }); flightPath.setMap(map); ستظهر لك الخريطة بهذا الشكل: إضافة نافذة نصية InfoWindowتتيح لك ميزة infoWindow إظهار نافذة على موقع معين محدد باسم بحيث يمكنك كتابة اسم الموقع المحدد بداخلها. كما هو موضح في الكود التالي: var map = new google.maps.Map(document.getElementById(“map”), mapProp); var marker = new google.maps.Marker({ position: new google.maps.LatLng(38.963745, 35.243322), }); marker.setMap(map); var infowindow = new google.maps.InfoWindow({ content:”Hello World!” }); infowindow.open(map, marker); }ستظهر لك الخريطة بهذا الشكل: هكذا نكون قد استعرضنا أهم النقاط والميزات التي تتيح لك استخدام خرائط Google Maps بسهولة في موقعك الخاص. هل أنت جاهز الآن لإضافة Google Maps إلى موقعك والإستفادة من مزاياها؟ الـمصدر: Google Developers.حقوق الصورة البارزة: Designed by Freepik.
    1 نقطة
  12. إذا كنت تريد نمو أعمالك بالعالم الرقمي ستحتاج بناء قائمة بريدية خاصة بك، فلا تختلق الأعذار كعدم توفر الوقت أو خبرتك القليلة بالأمر، فبالنسبة للخبرة ستجد بهذا الدليل كل ما تحتاجه لبناء قائمة بريدية، وكيف تحصل على مشتركين ببساطة .. يبقى أن توفر لنفسك بعض الوقت لقراءة الخطوات وتطبيقها وقتما شئت. تكمن أهمية القوائم البريدية في أنها أفضل الطرق لبناء علاقة جيدة مع الزبائن والعملاء الجدد، فرسالة بريد ترسلها لعميلك تعني أنك تهتم له وترغب في توفير كل الإفادة له وتقديم المنتجات المرتبطة به بعد تسجيله بالقائمة البريدية. "المال في القائمة" كما يقال في مجال الأعمال، كما أنه صعب على مبدعي المنتجات الرقمية الحصول على زبائن جدد، فكيف يستطيع البائع المحافظة على الاتصال بهذا العميل إذا لم يمتلك وسيلة اتصال به، بدون علاقة جيدة ومستمرة مع الزبائن فإن جهودك لتسويق منتجاتك ربما تحتاج أن تعيدها في كل مرة تطلق منتج رقمي. كيف تبني قائمة بريدية؟لبناء قائمة بريدية ستحتاج استخدام أحد الخدمات المدفوعة أو المجانية على الويب كمواقع (mailchimp–Aweber–getresponse) تستطيع بعدها استهداف قوائمك البريدية بحملات تسويقية ومواد مجانية، نعم فيمكن لك إنشاء أكثر من قائمة حسب اهتمامتهم أو صفاتهم المشتركة. بكتاب "دليلك المختصر لبيع المنتجات الرقمية" تم شرح موقع Aweber وهي خدمة مدفوعة يمكنك اختيارها حسب إمكانياتك والمميزات التي يقدمها الموقع، وكذلك الأمر بالنسبة لـ getresponse، أما mailchimp فهو يتيح لك استخدام حساب مجاني بسعة 2000 مشترك، وهو أمر جيد إذا كنت تريد أن تبدأ به، ثم الانتقال للحساب المدفوع بعد نمو عملك ببيع المنتجات الرقمية. كيفية استخدام mailchimpبعد التسجيل بموقع mailchimp فإن أول خطواتك هي عمل قائمتك البريدية الأولى ويتيح لك الموقع إضافة القائمة من خيار import أو يدويًا إذا كنت تمتلك قوائم بريدية مسبقًا، إلا انك يجب أن تنتبه لعدم وضع بريد لم يصرح لك صاحبه بذلك، أو تقوم بشراء قوائم بريدية بأي طريقةٍ كانت، فهذا أسوء من عدم إنشاء واحدة أصلاً، لأنك بذلك ستضع نفسك رسميًا برسائل الإزعاج وستُصنّف بأذهان أولئك العملاء تحت بند SPAM ليس فقط بالبريد ولكن أيضًا موقعك ومنتجاتك. بعد التسجيل وفي حال أنك لم تمتلك قائمة بريدية مسبقًا، فما تحتاجه هو أن تنشئ استمارة التسجيل التي ستحصل من خلالها على بُرُد العملاء وبياناتهم، ويوفر الموقع أكثر من نوع لاستمارة التسجيل، فتسطيع مثلاً عبر رقم 2 أن تحصل على شفرة الاستمارة لوضعها بأي مكان بموقعك، ومن خلال رقم 1 إنشاء استمارات عامة وتصميمها كما يناسبك، أم الخيار الثالث فهو لعمل استمارات تسجيل بخاصية النوافذ المنبثقة. فلنفترض مثلا أنك على مدار العام تقوم بعمل 10 كتب إلكترونية، فمن المهم أن تستهدف عملائك على مدار العام -في الغالب- على ثلاث مراحل، مرحلة قبل الإطلاق، مرحلة الإطلاق، ومرحلة المتابعة لكل منتج، وتحتاج استهداف المشتركين الجدد والذين لم يشتروا منتجاتك بعد، تستطيع ببساطة عمل كل هذا عن طريق استخدام الحملات. كيف تحصل على المشتركين؟تقريبًا لا أحد يرغب في زيادة رسائل صندوق الوارد إلا إذا كان سينال من ورائها فائدة أو شيء قيم، كمنتج مجاني، أو مقالة غنية بالمعلومات، وهذا كل ما تريد معرفته لتبدأ في الحصول على مشتركين بقائمتك البريدية، فلا أحد سيعطيك بريده للاشيء، هو يتوقع أن ينال فائدة أو شيء قيّم كل مرة. وفّر شيء قيّم مقابل التسجيل بقائمتك البريدية وستجد من يسجل بقائمتك بصدر رحب. 10 أفكار للحملات والرسائل البريديةلا فائدة من إنشاء قائمة بريدية طالما لن تبني علاقة جيدة مع المشتركين، لذلك فإن إيجاد أفكار جيدة لاستهداف العملاء والزبائن عبر القوائم البريدية من الأمور الهامة التي يجب أن تتابعها بين الحين والآخر، إذا كان لديك قائمة بريدية مليئة بالمشتركين الخاملين .. ولا تدري كيف توطد علاقتك معهم، فهذه 10 أفكار يمكنك استخدامها بأقرب وقت. 1. نصائح وإرشاداتالنصائح والإرشادات من الأمور التي يسعى الناس لها دومًا، فشخص لا يدري كيف يصلح شيء .. سيريد نصيحتك بالتأكيد، آخر لا يعلم كيف ينال وظيفة، كل شخص لديه مشكلة أو أمر بسيط لا يعرف كيف يتعامل به، دورك أن تقدم هذه النصائح مجانًا بشيء من الخصوصية لمشتركي قائمتك البريدية، كلما كانت النصائح بتخصصك ومجال عملك كلما كان ذلك أفضل وبنيت هويتك التسويقية عندهم. 2. التحذيرات والتنبيهاتإذا كان لديك قائمة خاصة ببعض المتعلمين المبتدئين فإنك ستحتاج أن ترسل لهم بعض التنبيهات أو الأخطاء التي قد يقعوا بها، مع توفير أسباب مقنعة لتلك التحذيرات والتنبيهات من خلال تجارب ودراسات للحالات. 3. أهم مقالات الأسبوعيمكنك تثبيت رسالة أسبوعية لأهم مقالات الأسبوع التي نُشرت بموقعك، مع توفير وصف بسيط لكل موضوع واستخدام بعض قواعد كتابة الإعلانات copywriting حتى يزيد معدل الزيارات بموقعك. 4. مقابلة مع أحد العملاءإذا أُعجب أحد زبائنك بمنتج معين فلمَ لا تنشر كلمته، اعرض عليه مقابلة شخصية عبر سكايب أو على بمقالة على صورة سؤال وجواب وأرسلها لقائمتك البريدية فلا أقوى من تسويق “السمعة” والدليل الاجتماعي. 5. استطلاعات الرأيقد تكون من الأمور الحكيمة القيام باستطلاع رأي بين الحين والآخر، فأنت بذلك تؤكد على أهمية آراء زبائنك وتستفيد من الاستطلاع بتوفير منتج يخدم احتياجات الزبائن. 6. أكثر المنشورات مشاركة هذا الشهرمرة أخرى وأهمية 3الدليل الاجتماعي social proof3، بإعلام عملائك بالمقالات الشهيرة بموقعك فإنك تؤكد على ريادتك لمجالك وتزيد من انتشار هذه المنشورات أكثر وأكثر. 7. مقابلة مع متخصصإذا كان يشغل بال عملائك شيء ما يحيرهم، فلمَ لا تقدم لهم الفصل في هذا الأمر عن طريق مقابلة مع متخصص زميل بنفس المجال، بفعل ذلك تبني ثقة الزبائن والعملاء فما تريده هو الوصول للحل حتى ولو مقابلة مع منافس خبير، تتجاذبان مع بعضكما البعض الحديث ما يزيد الأمر تشويقًا وإفادة. 8. اشرح كيف نجحت .. وشارك فشلكمشاركتك نجاحاتك مع العملاء من الأمور الجيدة التي تعود عليك وعليهم بالنفع على حد سواء، فسيستفيد جمهورك ويتعرفوا على طرقك، وسيزيد ارتباطهم بمنتجاتك لارتباطهم بقصص نجاحك. كذلك الأمر بالنسبة للأمور التي لم توفق بها، فتستطيع مشاركتهم تجاربك وماذا يمكنهم أن يتعلموا منها. 9. الأدلة الشاملةلن تجد شيئًا ينفع جمهورك أفضل من الأدلة الشاملة حول موضوعات تشغلهم، فكثير من الناس يتعب بالبحث هنا وهناك لإيجاد حل أو طريقة لفعل أمر ما، فتخيل فرحته عندما ترسل له دليل شامل يوفر له كل الخطوات والمصادر التي يحتاجها .. حبّذا لو كان كتاب إلكتروني. 10. عروض توضيحية وإنفوجرافيكأسرع وسيلة للتصفح والاستفادة هي المحتوى البصري، ومن خلال العروض التوضيحية والإنفوجرافيك ستستطيع الوصول للكثير من المشتركين وحثهم على مشاركة هذا المحتوى. التسويق عبر البريد من أشهر أنواع التسويق على الإطلاق، وما لم تهتم به ستخسر فرص عظيمة لبناء مكانك بعالم المنتجات الرقمية، من خلال هذا الدليل تعرفنا كيف تقوم بالاشتراك بخدمة لبناء القائمة البريدية mailchimp، وكيفية الحصول على مشتركين .. الطريقة السهلة، وبعض الأفكار التي يمكنك استخدامها بالحملات والرسائل. إذا كنت تجد شيء آخر يتعلق بالقوائم البريدية لم يذكر هنا .. فبانتظار مشاركتك. مصدر الصور: Pixapay، freepsdfiles. حقوق الصورة البارزة: Designed by Freepik.
    1 نقطة
  13. ها قد جاءت العطلة وقد خرجتَ لقضاء بعض الوقت خارج المنزل لتصل إلى مكان تحاط فيه بمناظر خلّابة، إلا أنّ جلّ محاولاتك في جمع المشهد الكامل في صورة واحدة باءت بالفشل. كلّنا نمرّ بهذه الحالة، ولكن لا تقلق فبرنامج فوتوشوب سيكون المنقذ. سنتعلّم في هذا الدرس طريقة صنع صور البانوراما من صور متعدّدة باستخدام برنامج فوتوشوب. ستكون مادة الدرس صورة بانورامية لقلعة ألنويك، ويمكنك تحميل الصور الفوتوغرافية التي سنجمعها للحصول على الصورة البانورامية. التقطتُ هذه الصور في سفرتي الأخيرة إلى نورثمبرلاند في بريطانيا، وإن كنت من متابعي هاري بوتر فمن المؤكّد أنك تعرف هذه القلعة جيّدًا ففيها تلقّى هاري درسه الأول في الطيران في الجزء المعنون بـ (حجر الفلاسفة). سنحتاج في البداية إلى حفظ الصور في مجلّد واحد، وبعد القيام بذلك افتح برنامج الفوتوشوب ثم اذهب إلى القائمة: File > Automate > Photomerge في خانة Layout اختر Auto، وأبقِ الخيار Files من قائمة Use في خانة Source Files محدّدًا ثم اضغط Browse. اذهب إلى المجلد الذي يحتوي على الصّور الخمسة لقلعة ألنويك ثمّ حدّدها جميعًا واضغط OK. تأكد من تحديد المربّعات الثلاثة في أسفل مربّع الحوار ثمّ اضغط OK. سيعمل الفوتوشوب الآن بمطابقة المساحات المتداخلة في الصور الفوتوغرافية، وبما أن هذه العملية معقدّة نوعًا ما فمن المرجّح أنّك ستنتظر لبضع دقائق إلى حين اكتمال العمليّة. بعد انتهاء الفوتوشوب من عملية دمج الصور، حدّد جميع الطبقات في لوحة الطبقات Layers، اذهب إلى القائمة: Layers > Merge Layers أو اضغط (CTRL+E أو CMD+E في الماك). اختر أداة القصّ Crop Tool وارسم مربعًا للقصّ من حافة النقطة السفلية في السّماء أقصى يسار الصورة إلى ما تحت الخيمة بقليل أسفل يمين الصورة، ولا تقلق بشأن المناطق الشفافة إذ سنعالجها في الخطوة القادمة. إن كنت راضيًا عن التحديد اضغط Enter او Return. لنتعامل الآن مع المساحة الفارغة أسفل اليمين. على الرغم من أنّ ما سنقوم به سريع وغير احترافيّ إلا أنّ النتائج ستكون جيّدة. ارسم حول المساحة الشفافة باستخدام أداة الحبل (Lasso Tool (L (وابق قريبًا من العشب قدر المستطاع عند مرورك فوقه)، وارسم كذلك فوق الدرابزين لأنّه بشع أيضًا. سترى الآن ما يسمى في الفوتوشوب بـ (النمل الزاحف Marching Ants) وهو يزحف حول المنطقة التي حدّدتها للتوّ. اختر من القائمة: Edit > Fill أو اضغط (SHIFT+F5) وفي خانة Contents تأكد من اختيار Content Aware من قائمة Use المنسدلة، ثم اضغط OK. يا للروعة لقد أصبح لدينا عشب جديد. مع أنّه ليس جيّدًا جدًّا إلا أنّه أفضل بكثير مما كان موجودًا في هذه المساحة سابقًا. كرّر هذه الخطوة لأيّ بقعة في العشب تعتقد بأنها غير جميلة. أعتقد أن صورتنا البانوراميّة ستبدو أفضل إن كانت خالية من النّاس، لذا وباستخدام الطّريقة السّابقة نفسها، أزل جميع الأشخاص من الصورة من خلال رسم تحديد حول كل فرد يمشي على هذه البقعة الخضراء الفاتنة والمحيطة بالقلعة. لنقم ببعض التعديلات على الصورة لجعلها أكثر حيويّة. في لوحة Adjustments اضغط على أيقونة Curves، سيضيف البرنامج طبقة تعديل Adjustment Layer جديدة يمكن تحريرها في أي وقت تشاء. غيّر مواضع نقاط التحكم في المنحني إلى أن تصل إلى نتيجة مرضية، أو استخدم أحد الإعدادات المعرّفة مسبقًا تحت قائمة Preset المنسدلة مثل الإعداد Lighter. بقي أن نضيف بعض الحدّة إلى الصّورة باستخدام المرشّح High Pass. اضغط على CTRL+A لتحديد الصورة بأكملها، ثم من قائمة Edit اختر Copy Merged أو اضغط SHIFT+CTRL+C. الصق الصّورة فوق بقيّة الطبقات. اذهب إلى القائمة: Filter > Other > High Pass مع الإبقاء على تحديد الطبقة العلويّة. غيّر قيمة نصف القطر Radius في مربع الحوار إلى أن تحصل على بعض التفاصيل الدقيقة في الخلفيّة الرماديّة، واضغط OK. غيّر نمط دمج الطبقة إلى Overlay والشفّافيّة إلى 45%. إن تأثير هذا المرشّح دقيق جدًّا وستلاحظه بصورة أساسيّة في حجارة حائط القلعة. هذا كل شيء، لقد اكتملت الصورة البانوراميّة لقلعة ألنويك، ومن المؤكد أنّك لن تعاني مجدّدًا في التقاط الصّورة المثاليّة في إجازاتك القادمة. ترجمة -وبتصرّف- للمقال How to stitch a panorama in Photoshop لصاحبته Liz Canning.
    1 نقطة
  14. توفّر مكتبة Swing مجموعة من العناصر Controls مثل JMenu التي تقوم بإنشاء قوائم أساسية وفرعية في تطبيقات جافا. لتتمكن من استخدام الصفين JMenu و JMenuItem قم بعمل import لهما كما في المثال التالي: import javax.swing.JMenu; import javax.swing.JMenuItem;لعمل قوائم يجب إنشاء قوائم أساسية JMenu ومن ثم قوائم فرعية JMenuItem، لنقم بعمل قائمتين أساسيتين File, Edit وقائمة فرعية تحوي 4 قوائم (New, Save, Save As, Close). يجب قبل كل شيء أن نقوم بتهيئة واجهة التطبيق بإضافة عنصر JFrame والذي سيحوي بداخلة كل عناصر التطبيق. لإضافة القائمة إلى JFrame نقوم بإنشاء شريط JMenuBar ومن ثم إضافة القائمة إليها. مثال: import java.awt.BorderLayout; import javax.swing.*; public class JMenuExample { public static void main(String[] args) { JFrame frame = new JFrame("JMenuExample"); JPanel panel =new JPanel(new BorderLayout()); JMenuBar mb = new JMenuBar(); JMenu m1 = new JMenu("File"); JMenu m2 = new JMenu("Edit"); JMenuItem mItem1 = new JMenuItem("New"); JMenuItem mItem2 = new JMenuItem("Save"); JMenuItem mItem3 = new JMenuItem("Save As"); JMenuItem mItem4 = new JMenuItem("Close"); m1.add(mItem1); m1.add(mItem2); m1.add(mItem3); m1.add(mItem4); mb.add(m1); mb.add(m2); panel.add(mb, BorderLayout.NORTH); frame.add(panel); frame.setSize(500, 500); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } لاحظ أن عنصر JMenuBar هو الذي قمنا بإضافته إلى JFrame والذي يحوي بداخله القوائم الأساسية والقائمة الفرعية. كيف أنشئ قائمة menu في جافا باستخدام swing؟
    1 نقطة
  15. يمكن عكس ترتيب عناصر مصفوفة بسهولة وذلك باستخدام الدالة reverse، توجد الدالة في الصف Collection وهي دالة static ويمكن لأي صف يرث من الصف Collection أن يقوم باستخدام الدالة reverse java.util.Collections.reverse()يكون تعريف الدالة في الصف Collection كالتالي: public static void reverse(List<?> list) لنقم بإنشاء مصفوفة قائمة ArrayList وتعبئتها بالعناصر A,B,C,D,E ثم تطبيق الدالة reverse عليها وطباعة النتيجة: public static void main(String[] args) { // create array list object ArrayList arrlst = new ArrayList(); // populate the list arrlst.add("A"); arrlst.add("B"); arrlst.add("C"); arrlst.add("D"); arrlst.add("E"); System.out.println("The initial list is :"+arrlst); // reverse the list Collections.reverse(arrlst); System.out.println("The Reverse List is :"+arrlst); }ستكون النتيجة كالتالي: كيف أعكس عناصر قائمة ArrayList في جافا؟
    1 نقطة
  16. لإظهار محتوى ملف في linux command line نستخدم الأمر cat وهو مشتق من كلمة catenate. يقوم الأمر بقراءة البيانات من الملفات ومن ثم إظهار محتواها، الأمر cat هو من أكثر الأوامر استخدامًا في لينكس حيث يمكن استخدامه إما لإظهار الملفات النصية، أو نسخ ملف نصي لمستند جديد، أو إضافة محتوى ملف نصي إلى نهاية محتوى ملف نصي آخر (تضمين ملفين). لإظهار نص من ملف بكل سهولة باستخدام الأمر cat فقط قم بكتابة اسم الملف الذي تريد إظهاره مع اللاحقة بعد الأمر cat كما في المثال التالي: cat mytext.txtسيقوم الأمر بقراءة الملف النصي وطباعة المحتوى على الشاشة، في حال كان محتوى الملف طويل جدًا سوف ترى القسم الأخير من الملف فقط. في حال رغبتك بقراءة المستند بشكل صفحات page-by-page أو عمل شريط تمرير scroll back and forth يمكنك استخدام الـpager أو الواجهة viewer مثل pg, more or less في حال قمت بكتابة أكثر من اسم ملف بعد الأمر cat فسيقوم الأمر بإظهار محتوى الملفات واحد تلو الآخر. cat mytext.txt mytext2.txtكيف أطبع أو أُظهر محتوى ملف في Linux Commands؟
    1 نقطة
  17. يُستخدم الأمر mv في لينكس لإعادة تسمية الملفات أو المجلدات اعتمادًا على كيفية استخدامها، يمكن أيضًا استخدام الأمر mv لنقل الملف من مجلد لآخر. لإعادة تسمية ملف نقوم بكتابة الأمر التالي: [me@linuxbox me]$ mv filename1 filename2نكتب الاسم الحالي للملف ومن ثم الاسم الجديد. لنقل ملف إلى مجلد آخر directory نكتب الأمر التالي: [me@linuxbox me]$ mv file... directoryهنا أمثلة عن كيفية استخدام الأمر mv والخيارات: الأمرmv file1 file2 في حال كون الملف file2 غير موجود إذًا سيتم إعادة تسمية الملف file1 بـfile2 أما في حال وجود الملف file2 فسيتم استبدال محتوى الملف file2 بمحتوى الملف file1.الأمرmv -i file1 file2 لا يختلف هذا الأمر عن الأمر أعلاه بيد أن إضافة الخيار "i" يقوم في حال وجود الملف file2 بإخبار المستخدم بأن هناك عملية استبدال لمحتوى الملف file2 بمحتوى الملف file1.الأمرmv file1 file2 file3 dir1 الملفات file1,file2,and file3 تُنقل إلى المجلد dir1، أما في حال كون المجلد dir1 غير موجود سيقوم الأمر mv بإظهار خطأ.الأمرmv dir1 dir2 في حال كون المجلد dir2 غير موجود سيعاد تسمية المجلد dir1 بـ dir2، أما في حال وجود المجلد dir2 يٌنقل المجلد dir1 إلى داخل المجلد dir2.
    1 نقطة
  18. يُستخدم الأمر chmod لتغيير الصلاحيات كالقراءة والكتابة والتنفيذ على الملفات files أو المجلدات directories. لاستخدامها قم بتحديد الصلاحية أو الإذن المطلوب والملف أو المجلد الذي تريد تعديله. كيف نحدد الأذونات permissions؟ يمكن بسهولة تصور إعدادات الأذونات على أنها سلسلة من البتات series of bits سأعرض بعض الأمثلة لفهم كيف يتم تحديد الأذونات، إن كل ثلاث بتات تحدد بـ rwx أي write, read, and execute (كتابة، قراءة، تنفيذ) مثال: rwx rwx rwx = 111 111 111 rw- rw- rw- = 110 110 110 rwx --- --- = 111 000 000 and so on... rwx = 111 in binary = 7 rw- = 110 in binary = 6 r-x = 101 in binary = 5 r-- = 100 in binary = 4 في حال كان البت المقابل للحرف هو 1 هذا يعني أن الأذن مسموح وأما 0 فهو غير مسموح. ولكن لماذا توجد ثلاث مجموعات لكل سلسلة؟ الجواب هو أنه كل مجموعة تحدد لنوع مستخدم معين وهي ثلاث أنواع (owner, group, and other)، على سبيل المثال إن كنت تريد جعل ملف معين أن يكون له صلاحية للقراءة والكتابة من قبل صاحب الملف owner وأن تجعل الملف يبقى مخفيًا أو خاص عن البقية others سيكون الأمر كالتالي: [me@linuxbox me]$ chmod 600 some_fileهنا أشهر القيم التي تستخدم لتحديد الصلاحيات على الملفات والمجلدات: 777 (rwxrwxrwx) لا قيود على الأذونات، أي شخص يمكنه عمل أي شيء، عمومًا هذا وضع غير مرغوب فيه.755 (rwxr-xr-x) صاحب الملف يمكنه القراءة والكتابة وتنفيذ الملف، الآخرين يمكنهم قراءة وتنفيذ الملف (هذه الإعدادت شائعة للبرامج التي تستخدم من قبل جميع المستخدمين.700 (rwx------) صاحب الملف فقط من يحق له التعديل على الملف قراءة، كتابة وتنفيذ، ولا أحد آخر له الصلاحية بذلك (هذه الإعدادات مفيدة للبرامج التي يستخدمها صاحب الملف owner فقط ويجب أن تبقى محجوبة عن الآخرين.666 (rw-rw-rw-) كل المستخدمين يمكنهم القراءة والكتابة على الملف.644 (rw-r--r--) صاحب الملف يمكنه القراءة والكتابة على الملف أما الآخرين فيمكنهم القراءة فقط هذا إعداد شائع للملفات التي يجب أن تتغير من قبل صاحب الملف فقط.600 (rw-------) صاحب الملف يمكنه القراءة والكتابة فقط على الملف والآخرين ليس لديهم أي صلاحيات لذلك (هذا إعداد شائع للملفات التي يريد صاحب الملف أن يبقيها خاصة privateملاحظات: الصلاحية الخاصة بالتنفيذ execute تكون فعالة على البرامج التنفيذية أي التي تحتوي على شيفرات برمجية.لا يوجد لاحقة معينة للملفات التنفيذية في لينكس مثل ويندوز الذي ينفرد بلاحقة واحد للملفات التنفيذية وهي .exe
    1 نقطة
  19. ليس هنالك فرقًا حقيقيًا بين التعريفين يمكنك تعرف المصفوفة إما بكتابة القوسين قبل prefixing أو بعد suffixing اسم المصفوفة. الفرق يظهر في حال قمت بتعريف أكثر من مصفوفة على سطر واحد مثال: int a[], b; // first is int array, second is just int variable قمنا هنا بوضع القوسين بعد اسم المصفوفة أي أن أي متغير آخر سيتم تعريفه بعدها سيعتبر متغير عادي وليس مصفوفة. أما في حال وضع القوس قبل اسم المصفوفة فإن جميع المتغيرات التي تكتب بعدها ستعتبر مصفوفة أيضًا ما لم يسبقها نوع جديد للمتغير مثال: int[] c, d; // both c and d are integer array
    1 نقطة
  20. يقوم الأمر ls بإظهار قائمة الملفات والمجلدات directories في الدليل الحالي أي يظهر محتوى الدليل الحالي، يمكن استخدام الأمر ls بعدّة طرق وهنا بعض الأمثلة: الأمر ls لوحده يقوم بإظهار قائمة الملفات في دليل العمل الحالي.الأمر ls /bin يظهر قائمة الملفات في الدليل bin (أي دليل معين تريد اظهار محتواه تقوم بكتابة اسه بعد الأمر ls).الأمر ls -1 يظهر قائمة الملفات في دليل العمل الحالي بصيغة طويلة long format.الأمر ls -1 /etc /bin يظهر قائمة الملفات في الدليل bin والدليل etc بصيغة طويلة long format.الأمر ls -la يظهر قائمة جميع الملفات بما فيها الملفات المخفية في الدليل الأب parent لدليل العمل الحالي working directory بصيغة طويلة long format.$ ls -1 bin boot cdrom dev etc home initrd initrd.img libللمزيد عن استخدام الأمر ls انظر الرابط أدناه: كيف أعرض جميع الملفات الموجودة في working directory في موجه أوامر لينكس؟
    1 نقطة
  21. يمكن عمل مصفوفة ArrayList أن تكون للقراءة فقط باستخدام الدالة: Collections.unmodifiableCollection() والتي ترجع متغير غير قابل للتعديل readonly view of Collection أي لا تستطيع أن تقوم بتنفيذ أي عملية تعمل على تغيير المجمع collection مثل عملية الإضافة add او الإزالة remove او التغيير set. وفي حال تطبيق أي تغيير على المصفوفة (collection) سيتم رمي استثناء: UnsupportedOperationExceptionالطريقة الأكثر شيوعًا في إنشاء مصفوفة غير قابلة للتعديل هي باستخدام الدالة asList في الصف Arrays Class: Arrays.asList(String{[])والتي تُرجع قائمة List لا يُسمح عليها تطبيق عمليات الإضافة أو الإزالة. سأعرض مثال عن كيفية جعل ArrayList تصبح مصفوفة أو قائمة للقراءة فقط read only، سأستخدم الدالة asList من الصف Arrays لإنشاء مصفوفة قائمة ArrayList ذات طول ثابت fixed length ومن ثم تغليفها أو تحويلها إلى تجميع غير قابل للتعديل unmodifiable collection لجعلها للقراءة فقط: public static void main(String args[]) { //creating read only Collection in Java Collection readOnlyCollection = Collections.unmodifiableCollection(new ArrayList<String>()); readOnlyCollection.add("Sydney Sheldon"); //raises UnSupportedOperation exception //making existing ArrayList readonly in Java ArrayList readableList = new ArrayList(); readableList.add("Jeffrey Archer"); readableList.add("Khalid Hussain"); List unmodifiableList = Collections.unmodifiableList(readableList); //add will throw Exception because List is readonly unmodifiableList.add("R.K. Narayan"); //remove is not allowed in unmodifiable list unmodifiableList.remove(0); //set is not allowed in unmodifiable List unmodifiableList.set(0, "Anurag Kashyap"); //creating Fixed Length List from Array in Java List fixedLengthList = Arrays.asList("Mark" , "Twen"); // readOnlyList.add("J.K. Rowling"); //raises Exception fixedLengthList.set(0, "J.K. Rowling"); //allowed that's why not read only list System.out.println(fixedLengthList.get(0)); } كيف يمكن عمل ArrayList للقراءة فقط read only في جافا؟
    1 نقطة
  22. يتم ذلك عن طريق الخاصية Resources حيث يتم إنشاء وتحديد التصميم Style وتحديد نوع العنصر الذي نريد تطبيق التصميم عليه في الخاصية TargetType مثلًا TargetType="Button" ثم بعد ذلك يتم بناء Setters في كل وسوم <Setter> يتم تحديد الخصائص التي ستتغير في العنصر مثل الطول، العرض، اللون، لون الخلفية..الخ. مثال لنقم ببناء تصميم Style على الأزرار Buttons الموجودة في StackPanel: <StackPanel> <StackPanel.Resources> <Style TargetType="Button" x:Key="ButtonStyle"> <Setter Property="Width" Value="200"/> <Setter Property="Height" Value="100"/> <Setter Property="Margin" Value="4"/> <Setter Property="FontSize" Value="20"/> <Setter Property="Background"> <Setter.Value> <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5"> <GradientStop Color="Blue" Offset="0.0"/> <GradientStop Color="LightBlue" Offset="0.5"/> <GradientStop Color="Navy" Offset="1"/> </LinearGradientBrush> </Setter.Value> </Setter> </Style> </StackPanel.Resources> إنشاء الأزرار وتطبيق التصميم على الزر عن طريق الخاصية Style="StaticResource nameofStyle": <Button Style="{StaticResource ButtonStyle}" Content="Click Me"></Button> <Button Style="{StaticResource ButtonStyle}" Content="OK"></Button> <Button Style="{StaticResource ButtonStyle}" Content="Cancel"></Button> </StackPanel>
    1 نقطة
  23. توفر الدالة Array.Copy() طريقة لنسخ مصفوفة إلى مصفوفة أخرى عن طريق تحديد المعاملين 2 arguments وهما المصفوفة المصدر source والمصفوفة destination وتحديد المعامل الثالث وهو طول المصفوفة التي نريد نسخها. لنقم بعمل مثال وإنشاء مصفوفتين وتعبئتهما بمجموعة عناصر ثم نسخ المصفوفة الثانية للمصفوفة الأولى ومن ثم طباعة قيمة المصفوفة الأولى قبل وبعض النسخ لمقارنة المحتويين: static void Main(string[] args) { String [] arr1 = {"1","2","3","4","5"}; String [] arr2 = {"A","B","C","D","E"}; Console.WriteLine("before copy:"); for (int i = 0; i < arr1.Length; i++) { Console.Write(arr1[i] + " "); } Array.Copy(arr2, arr1,arr1.Length); Console.WriteLine("\nafter Copy:"); for (int i = 0; i < arr1.Length; i++) { Console.Write(arr1[i]+" "); } Console.ReadLine(); }
    1 نقطة
  24. يمكن ذلك عن طريق الخاصية :checked التي ستنفذ عند اختيار أحد الـradio buttons. ليكن لدينا form يحوي على ثلاث radio buttons <form id="myForm"> <input type="radio" name="radioName" value="1" /> 1 <br /> <input type="radio" name="radioName" value="2" /> 2 <br /> <input type="radio" name="radioName" value="3" /> 3 <br /> </form>الآن نكتب الـ script الذي سينفَذ عند اختيار أحد الـ radio buttons: $('#myForm input').on('change', function() { alert($('input[name=radioName]:checked', '#myForm').val()); });لاحظ أننا وضعنا الخاصية :checked بعد تحديد اسم الـ radiobutton الذي نريد أخذ قيمته عند اختياره عن طريق الدالة .val() يمكن أيضًا استخدام معرف العنصر id لتحديد الـradiobutton كما في المثال التالي: <input id="rad1" type="radio" name="radioName" value="1" /> 1 <br />في الـ script نكتب: $('#myForm input').on('change', function() { alert($('#rad1:checked', '#myForm').val()); });
    1 نقطة
  25. يمكن ذلك من خلال تحديد قيمة الخاصية initialValue في RequiredFieldValidator حيث توضع فيها قيمة أول عنصر في القائمة المنسدلة. ليكن لدينا ListBox تحتوي على أسماء مجموعة دول، نحدد أول عنصر ListItem نضع فيه القيمة Value هي "NoCountry"، وفي الخاصية initialValue للعنصر RequiredFieldValidator نضع نفس القيمة "NoCountry" مثال: <form id="form1" runat="server"> <asp:ListBox id="list" runat="server"> <asp:ListItem Selected="True" Value="NoCountry">--ChooseCountry--</asp:ListItem> <asp:ListItem Value="Australia">Australia</asp:ListItem> <asp:ListItem Value="USA">USA</asp:ListItem> </asp:ListBox> <asp:RequiredFieldValidator id="valList" ForeColor="#FF0000" ErrorMessage="Selection Invalid!" ControlToValidate="list" InitialValue="NoCountry" runat="server"/> <br /> <asp:Button id="Button1" Text="Submit" runat="server"/> </form>الآن عند عدم اختيار أي دولة من القائمة وعمل submit سيقوم العنصر RquiredFieldValidator بإظهار سالة خطأ (Selection Invalid!) أي أنه لم يتم تحديد أي دولة. كيف أطبق التحقق على قائمة منسدلة DropDownList باستخدام RequiredFieldValidator في ASP.Net؟
    1 نقطة
  26. تمكّنك خاصية z-index عند تطبيقها على عنصر من وضعه في المقدمة أي يأخذ grater stack order (المحور Z) حتى لو كان هناك عناصر متوضعة فوقه . لنفرض أنك تريد وضع نص أمام صورة (أي تظهر الصورة خلف النص) مثال: <!DOCTYPE html> <html> <head> <style> img { position: absolute; left: 0px; top: 0px; z-index: -1; } </style> </head> <body> <h1>This is a heading</h1> <img src="w3css.gif" width="100" height="140"> <p>Because the image has a z-index of -1, it will be placed behind the text.</p> </body> </html> لاحظ أننا وضعنا خاصية z-index=-1 للصورة أي أرجعناها للخلف حتى يظهر النص أمامها ولكن هذا لا يكفي، يجب تحديد الخاصية position للصورة وجعلها absolute أي أنها تأخذ المكان المحدد لها حتى لو كان هناك عناصر حولها. ((بشكل افتراضي جميع العناصر تأخذ الخاصية position: relative أي أنها تحدد إحداثياتها حسب العنصر الذي قبلها)) ولكن الخاصية absolute تجعل العنصر يتجاهل العناصر الموجودة ويأخذ مكانه بحسب الـdiv الموجود فيه. 1- مع الخاصية Z-index 2- بدون تحديد الخاصية z-index= -1 3- بدون تحديد position:absolute هل من توضيح حول خاصية Z-index في Css؟
    1 نقطة
  27. تناولنا في المقال السابق أساسيات التعامل مع مكتبة Google Maps JavaScript API لإنشاء الخرائط والرسم عليها والتفاعل معها مثل خاصية النقر على الخريطة وتحديد الأماكن. في هذا المقال سأتوسع في الشرح عن أنواع خرائط غوغل وخصائص كل نوع وعن كيفيّة رسم أشكال قابلة للتعديل والسحب على الخريطة، بالإضافة إلى خدمة street view منظور الشارع التي تتيح لك رؤية تفاصيل طرق وشوارع منطقتك، وسأختم بالحديث عن أهم وأكثر الخدمات المستخدمة وهي خدمة تحديد المواقع Geolocation. أنواع الخرائط Maps Typeتُوفّر مكتبة غوغل أربع أنواع خرائط رئيسية: ROADMAP ( الخريطة اإفتراضية العادية 2D map ).SATELLITE (خريطة مصورة).HYBRID (خريطة مصورة بالإضافة إلى أسماء الطرق والمدن).TERRAIN (خريطة تضمن الجبال والأنهار…الخ).يمكنك تحديد نوع الخريطة عن طريق الخاصية mapTypeId كما شرحنا في الدرس السابق. حيث يمكنك تحديدها إما عن طريق الـ Constructor المنشئ كما في الشيفرة التّالية: var myLatlng = new google.maps.LatLng(-34.397, 150.644); var mapOptions = { zoom: 8, center: myLatlng, mapTypeId: google.maps.MapTypeId.SATELLITE }; var map = new google.maps.Map(document.getElementById("map"), mapOptions);أو تعديلها عن طريق الدالة setMapTypeId: map.setMapTypeId(google.maps.MapTypeId.TERRAIN);الخريطة المصورة SATELLITE الخريطة المصورة مع أسماء المدن والطرق HYBRID الخريطة الجغرافية تتضمن جبال وأنهار.. الخ TERRAIN الخريطة التصويرية منظور 45° Imagery1. منظور 45° Imageryتتيح لك مكتبة غوغل إنشاء خريطة تصويرية بدقة عالية من منظور جغرافي معين، أنواع الخرائط التي تدعم الخريطة التصويرية من منظور 45 درجة هما: SATELLITE و HYBRID. يجب أن تكون قيمة التكبير zoom عالية أي أكثر من 17 لكي يظهر المنظور واضحًا. سأعرض الآن خريطتين لنفس المكان الأولى بدون خاصية منظور 45° درجة والأخرى مع خاصية منظور. لقد لاحظت من تجربتي أن هناك بعض المناطق لا تدعم خاصية المنظور مثل تركيا، لذا سيكون المثال هنا إيطاليا - فينيسيا وقصر دوجي بالتحديد: قصر دوجي من دون خاصية منظور 45°: قصر دوجي مع خاصية منظور 45°: الآن لتفعيل خاصية المنظور فقط قم بإضافة: setTilt(45)أما لتعطيل الخاصية نقوم بوضع القيمة 0 بدل 45: setTilt(0)كما في الشيفرة التّالية: function initialize() { var mapProp = { center: new google.maps.LatLng(45.434046, 12.340284), zoom: 18, mapTypeId: google.maps.MapTypeId.SATELLITE }; var map = new google.maps.Map(document.getElementById("map"), mapProp); map.setTilt(45); } google.maps.event.addDomListener(window, 'load', initialize); 2. خاصية التدوير في الاتجاهات الأربعةإن الخريطة التصويرية Imagery 45 تتضمن مجموعة من الصور لأربعة إتجاهات (شرق، غرب، شمال وجنوب). يمكنك تدوير المنظور تلقائيًا لتشاهد المكان من جميع الإتجاهات باستخدام الدالة ()setHeading وتمرير قيمة درجة التدوير ابتداءً من الشمال. أولًا نحدد للخاصية heading القيمة 90 جهة الشمال، ونعطي القيمة 45 درجة للخاصية tilt لتشغيل المنظور.نحن الآن بحاجة إلى زر Auto Rotate لنقوم بتشغيل التدوير التلقائي عند الضغط عليه. نعرف div ونعطيه التنسيق المناسب ليظهر وسط وأعلى الخريطة ثم نقوم بإنشاء زر داخل الـ div كما في الشيفرة التّالية:<style type="text/css"> #floating-panel { position: absolute; top: 10px; left: 25%; z-index: 5; background-color: #fff; padding: 5px; border: 1px solid #999; text-align: center; font-family: 'Roboto','sans-serif'; line-height: 30px; padding-left: 10px; } </style>الآن لنقم بكتابة دالة ()rotate90 مهمتها هي أخذ قيمة درجة التدوير الحالية heading وإضافة 90 درجة. سنستفيد من هذه الدالة عند استدعائها في كل مرة تدوير. function rotate90() { var heading = map.getHeading() || 0; map.setHeading(heading + 90); }ثم لنكتب الدالة المسؤولة عن التدوير التلقائي التي تقوم باستدعاء الدالة ()rotate90، هذه الدالة هي التي ستنفذ عندما نقوم بالضغط على الزر Auto Rotate function autoRotate() { // Determine if we're showing aerial imagery. if (map.getTilt() !== 0) { window.setInterval(rotate90, 3000); } } يمكننا التحكم بسرعة التدوير (الإنتقال بين الصور) عن طريق الدالة window.setInterval بتحديد قيمة المعامل الثاني (كلما كانت القيمة أصغر كلما كانت سرعة التدوير أكبر) تتحدد القيمة بالـmilliseconds. لنرى الآن قصر دوجي من الإتجاهات الأربعة: إضافة أشكال قابلة للتحرير والسحب على الخريطة editable and draggable shapesإن إضافة أشكال قابلة للتعديل والسحب تتيح للمستخدم التفاعل مع الخريطة بشكل أكبر وتحديد أماكن مختلفة بطريقته الخاصة. 1. إنشاء شكل قابل للتعديلإن أي شكل من الأشكال التي يمكن إضافتها ورسمها على الخريطة (polyline, polygon, circle) كما شرحناها في الدرس السابق يمكن أن تصبح أشكال قابلة للتعديل (تغيير حجمها، موضعها وشكلها) فقط قم بإسناد القيمة true للخاصية editable ضمن خصائص الشكل كما في الشيفرة التّالية: function initialize() { var mapProp = { center: new google.maps.LatLng(41.008238, 28.978359), zoom: 8, mapTypeId: google.maps.MapTypeId.ROADMAP }; var map = new google.maps.Map(document.getElementById("map"), mapProp); var flightPath = new google.maps.Circle({ center: new google.maps.LatLng(41.008238, 28.978359), radius: 20000, strokeColor: "#0000FF", strokeOpacity: 0.8, strokeWeight: 2, fillColor: "#045B45", fillOpacity: 0.4, editable: true }); flightPath.setMap(map); } google.maps.event.addDomListener(window, 'load', initialize); 2. إنشاء شكل قابل للسحب والتحريكيمكنك جعل الشكل قابل للسحب عن طريق تفعيل الخاصية draggable ضمن خصائص الشكل. ملاحظة: في حال كنت تطبق خاصية السحب على الشكل متعدد الخطوط polyline أو على المضلع polygon فإن عليك تفعيل الخاصية geodesic ليتم الإحتفاظ بالشكل الجغرافي الصحيح أثناء تحريك الشكل. كما في الشيفرة التّالية: var istanbul = new google.maps.LatLng(41.008238, 28.978359); var antalya = new google.maps.LatLng(36.896891, 30.713323); var trabzon = new google.maps.LatLng(41.002697, 39.716763); function initialize() { var mapProp = { center: istanbul, zoom: 5, mapTypeId: google.maps.MapTypeId.ROADMAP }; var map = new google.maps.Map(document.getElementById("map"), mapProp); var redCoords = [ istanbul, antalya, trabzon ]; // إنشاء مثلث أحمر قابل للتحريك مع تفعيل الخاصية geodesic new google.maps.Polygon({ map: map, paths: redCoords, strokeColor: '#FF0000', strokeOpacity: 0.8, strokeWeight: 2, fillColor: '#FF0000', fillOpacity: 0.35, draggable: true, geodesic: true }); } قبل التحريك: بعد التحريك: منظور الشارع Street Viewتوفر مكتبة Google Maps JavaScript API خدمة عرض الشوارع سأقوم هنا بشرح كيفية تفعيل خاصية عرض الشوارع الإفتراضية على خريطتك. 1. البانوراما Panorama:يتم دعم خدمة عرض الشوارع من خلال استخدام الكائن StreetViewPanorama،الذي يوفر واجهة API لعرض الشوارع. إن كل خريطة تحتوي على خاصية عرض شوارع إفتراضية panorama بانوراما، والتي يمكنك الحصول عليها عن طريق استدعاء الدالة للخريطة ()getStreetView. عند تفعيلك للخاصية streetViewControl فإنك تلقائيًا تكون قد فعلت خاصية عرض الشوارع الإفتراضية. يمكنك أيضًا إنشاء كائن StreetViewPanorama خاص بك لاستخدامه بدلًا من الإفتراضي. var panorama; function initialize() { panorama = new google.maps.StreetViewPanorama(document.getElementById('map'), { position: { lat: 41.008238, lng: 28.978359 }, pov: { heading: 165, pitch: 0 }, zoom: 1 }); } google.maps.event.addDomListener(window, 'load', initialize);سأقوم الآن بعرض الخريطة وبجانبها بانوراما (عرض الشوارع). قم بإنشاء div وإعطاءه "id= "pano: <div id="map"></div> <div id="pano"></div>لنقوم الآن بتحديد التنسيقات لتظهر الخريطة بجانب البانوراما كما في الشيفرة التّالية: #map, #pano { float: left; height: 100%; width: 45%; }نقوم الآن بتحديد إحداثيات المكان (خط الطول وخط العرض) للمكان الذي نريد إظهاره مثلاً مدينة اسطنبول، ونقوم بتحديد الخصائص للبانوراما عن طريق StrrtViewPanorama: كما في الشيفرة التّالية: function initialize() { var fenway = {lat: 42.345573, lng: -71.098326}; var map = new google.maps.Map(document.getElementById('map'), { center: fenway, zoom: 14 }); var panorama = new google.maps.StreetViewPanorama(document.getElementById('pano'), { position: fenway, pov: { heading: 34, pitch: 10 } }); map.setStreetView(panorama); } خدمة تحديد المواقع Geolocationإن خدمة تحديد المواقع تتيح لك تحديد موقع المستخدم الذي يزور موقعك مثلاً وذلك عن طريق عنوان الـIP الخاص به. إن تحديد الموقع الجغرافي يعتمد أساساً على الجهاز والمتصفح الذي يستخدمه الزائر لذا فإن هنالك بعض الأجهزة والمتصفحات لا تدعم خدمة تحديد المواقع، فلا يمكننا القول أن هذه الخدمة هي خدمة ممكنة ومتاحة دائمًا في موقعك أو تطبيق الويب الخاص بك. تستخدم بعض المتصفحات عنوان IP لكشف مكان وجود المستخدم، وبما أن عنوان IP ليس إلا تقدير تقريبي لموقع المستخدم فلا يمكنك الإعتماد عليها في تحديد المواقع بدقة، كما أنها خدمة يمكن للمستخدم تعطيلها في المتصفح الخاص به. لنرى الآن كيف يمكننا تحديد موقع الجهاز الخاص بنا عن طريق Geolocation. سنقوم أولًا بأخذ الإحداثيات (خط الطول وخط العرض) للمستحدم عن طريق الدالة getCurrentPosition وتخزينها بالمتغير pos: navigator.geolocation.getCurrentPosition(function(position) { var pos = { lat: position.coords.latitude, lng: position.coords.longitude }; وبما أن هذه الخدمة يمكن ألا يدعمها المتصفح أو أن يقوم بتعطيلها المستخدم فإن علينا أن نتأكد من أن الخاصية مفعلة أولًا: if (navigator.geolocation) {…………}في حال أن المتصفح يدعم الخدمة وأنها مفعلة يتم إظهار موقع المستخدم وإلا ستظهر رسالة خطأ ولن يتم عرض موقع المستخدم. infoWindow.setPosition(pos); infoWindow.setContent('Location found.'); map.setCenter(pos); }, function() { handleLocationError(true, infoWindow, map.getCenter()); }); } else { // Browser doesn't support Geolocation handleLocationError(false, infoWindow, map.getCenter()); } } function handleLocationError(browserHasGeolocation, infoWindow, pos) { infoWindow.setPosition(pos); infoWindow.setContent(browserHasGeolocation ? 'Error: The Geolocation service failed.' : 'Error: Your browser doesn\'t support geolocation.'); }الآن لاحظ أن المتصفح عرض نافذة للمستخدم ليخبره بأن صفحة الويب الحالية تريد أن تعرف موقعه هل تسمح بذلك؟ كانت هذه أبرز المواضيع والأدوات الأكثر شيوعاً في التعامل مع خرائط Google Maps لمن لم يسبق له استخدامها.
    1 نقطة
×
×
  • أضف...