الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

[ تنبيه ] ؟؟How I can write the event of run menue button

بدأه sara33 في 11 مايو 2012 · 16 رد · 793 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلاام علــيكم ..

أنشــات واجهه رسوميـه لعمل برناامج بسيط مثل الجكريتر والنتبينز ..أنشأأت الواجهه الحمد لله بشكل كاامل

لكن مشكــلتي في run button لم أستطــع ترجمة الايفنت تبعه ؟؟؟

فكرة الواجهه ..يكون عندي JTabbedPane وأضفتله JtextArea ل Source Code &&JtextArea ل Output

هذا الكود بشكل مبسط ...

 JMenu runMenu=new JMenu("Run");
 JMenuBar bar=new JMenuBar();
     setJMenuBar(bar);

bar.add(runMenu);


JTextArea text=new JTextArea(null,150,60);
     pane.addTab("source code",null,text,"code");



JTextArea text1=new JTextArea(null,150,60);
       pane.addTab("OutPut",null,text1,"Resualt");


     add(pane);

أناا حااولت أسوي ايفنت بحيث إذا اليوزر كتب على السورس تكست أريا وبعدين يضغط رن يترجم الأوت بوت ويكون على الأوت بوت تكست أريا ...

حـــاااولت كثييراا لكن مااوصلت للحل ؟؟

يــاارب يكون وصلت فكرة السؤال ؟؟

وشكراا مقدماا

#2

اعملي mouseClicked من خلال ضغطة زر يمنى على الButton .. بعدين اختاري الEvent وبعدين اختاري Mouse

ادخلي الكود بتاعك ضمن الميتود هاي :happy: :happy:

556891961.gif

I am learning from you

it is the programmer eye

#3

هناك اشياء لم تصل لي في فكرتك

اولا على ما فهمت انك تقوم بعمل مترجم بسيط ، يتعرف على قوانين لغه خاصه بك

ثانيا هل تعرف كيف تقو بترجمة كودك؟ يعني عندما تضغط run يجب ان تستدعى دالة داخل الحدث تقوم بترجمة النص المكتوب داخل textarea وتحوله الى output يمكنك كتابة لغتك الخاصة باستخدام الreuglar expressions هذا اذا لم تقم بعد بترجمة كودك

اما اذا كنت قد ترجمته فلا عليك من هذه النقطة

ثالثا: اين تقوم بطباعة الخرج ، افترض على textarea اخرى حيث تستدعي الدالة setText عليها

الان ماهي المشكله بالضبط واين؟

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#4

:wacko: :wacko: :wacko:

أنا آسف ... ظننت انك تتكلمي عن الJButton :lol: :lol:

رجاءا ... ضعي الكود بتاعك واحنا نرى اين الخطأ :wink:

موفقة :happy: :happy:

556891961.gif

I am learning from you

it is the programmer eye

#5
mental-driller كتب:

هناك اشياء لم تصل لي في فكرتك

اولا على ما فهمت انك تقوم بعمل مترجم بسيط ، يتعرف على قوانين لغه خاصه بك

ثانيا هل تعرف كيف تقو بترجمة كودك؟ يعني عندما تضغط run يجب ان تستدعى دالة داخل الحدث تقوم بترجمة النص المكتوب داخل textarea وتحوله الى output يمكنك كتابة لغتك الخاصة باستخدام الreuglar expressions هذا اذا لم تقم بعد بترجمة كودك

اما اذا كنت قد ترجمته فلا عليك من هذه النقطة

ثالثا: اين تقوم بطباعة الخرج ، افترض على textarea اخرى حيث تستدعي الدالة setText عليها

الان ماهي المشكله بالضبط واين؟

أخـــي الله يجززاك خير فهمكــ صحيح أريد عمل مترجم بسيط بلغة الجافا ...مشكــلتي أنــي لم أعررف ترجمــة الكود ..أما مكان الطباعه على textarea ..

تم تعديل هذه المشاركة بواسطة sara33 في 12 مايو 2012 في 00:28

#6

أخـي المشاكس ..كودي لايوجد فيه خطأ ويعمل بشكل صحيح مجرد هذا البوتون لم استطع كتابة الحدث الخااص به ..

وشكراا لك ..

#7

قومي اولا بتعريف لغتك التي تريدين ترجمتها ، يمكنك المحاوله على برامج مثل ANTLR ثم بعد ذلك عليك بالregular expression او regex

بعدما تواجهين المشاكل في regex ضعي السؤال ونحن موجودون إن شاء الله

بالتوفيق

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#8
mental-driller كتب:

قومي اولا بتعريف لغتك التي تريدين ترجمتها ، يمكنك المحاوله على برامج مثل ANTLR ثم بعد ذلك عليك بالregular expression او regex

بعدما تواجهين المشاكل في regex ضعي السؤال ونحن موجودون إن شاء الله

بالتوفيق

آخــي الله يجزاك خير يااليت توضحلي فكرة البرنامج ..و regular expression او regex

أكثر لأنــي بصراحه أول مره أجربها وبإذن الله أحااول ...

#9
mental-driller كتب:

قومي اولا بتعريف لغتك التي تريدين ترجمتها ، يمكنك المحاوله على برامج مثل ANTLR ثم بعد ذلك عليك بالregular expression او regex

بعدما تواجهين المشاكل في regex ضعي السؤال ونحن موجودون إن شاء الله

بالتوفيق

تستطيع استعمال خيار الmatching :wink:

عندي نفس المشكلة ، بس بالنسبة Lexical & Semantic Analysis :dry: :dry:

:)

556891961.gif

I am learning from you

it is the programmer eye

#10

الفكره يا اختي هي انك لما تضغطي الزر بتقومي بقراءة النص من الtextaarea باستخدام getText بعدها تقومين بعملية فحص بنية النص بالــregular expression

هذا كود قمت بكتابته في مشروع منذ زمن

package core.app;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.io.Serializable;
import java.util.StringTokenizer;

/**
 *
 * @author MENTAL_DRILLER
 */
public class Bridge implements Serializable{
    private String input ;
    private Program p ;
    private AddTab register;

    public AddTab getRegister() {
        return register;
    }

    public void setRegister(AddTab register) {
        this.register = register;
    }



    public String getInput() {
        return input;
    }

    public void setInput(String input) {
        this.input = input;
    }

    public Program getP() {
        return p;
    }

    public void setP(Program p) {
        this.p = p;
    }

    public Bridge(String input) {
        this.input = input;
        p = new Program();
        register = new AddTab();
    }
   public int assembleCode()throws Errors{
        Pattern misses = Pattern.compile("[^(\\s*(((LDA|SUB)\\s+\\w+)|((OUT|HLT)))\\s*)+]", Pattern.CASE_INSENSITIVE);
        Pattern regAddr = Pattern.compile("\\s*REG\\s*\\w+\\s*\\d+\\s*\\d+\\s*" , Pattern.CASE_INSENSITIVE);
        Pattern code = Pattern.compile("\\s*(((LDA|SUB)\\s+\\w+)|((OUT|HLT))\\s+)\\s*" , Pattern.CASE_INSENSITIVE);

        Matcher regAddrMatcher = regAddr.matcher(input);
        Matcher opCodeMatcher = code.matcher(input);
        Matcher missesMatch = misses.matcher(input);

        if(missesMatch.find() == true)
           throw new Errors(8);

        boolean found = false ;
        String opcode="";
        String address=null;
        boolean foundHLT = false ;
        try{

           while(regAddrMatcher.find()){
                System.out.printf("I found the text \"%s\" starting at " +
                               "index %d and ending at index %d.%n",
                               regAddrMatcher.group(), regAddrMatcher.start(), regAddrMatcher.end());

                String s = input.substring(regAddrMatcher.start(), regAddrMatcher.end());
                StringTokenizer tokens = new StringTokenizer(s);
                String reg = tokens.nextToken();
                String varName = tokens.nextToken();
                System.out.println("Variable name is " + varName);
                int varAddress = Integer.parseInt(tokens.nextToken());
                System.out.println("Variable address is " + varAddress);
                int varValue = Integer.parseInt(tokens.nextToken());
                register.RegAddress(varName, varAddress, varValue);
                System.out.println(register);

        }

        while(opCodeMatcher.find()){
                System.out.printf("I found the text \"%s\" starting at " +
                               "index %d and ending at index %d.%n",
                               opCodeMatcher.group(), opCodeMatcher.start(), opCodeMatcher.end());
                found = true;
                String c =input.substring(opCodeMatcher.start(),opCodeMatcher.end());
                c = c.trim();
                // System.out.println("C is " + c);
                for(int i = 0; i < c.length() && c.charAt(i)!= ' ' ; i++)
                {
                    opcode += c.charAt(i);
                    c = c.replace(c.charAt(i), ' ');

                }
                 //System.out.println("C after for is " + c);
                c = c.trim();

                if(c != null)
                    address = c ;
               // System.out.println(c);
               if(opcode.equalsIgnoreCase("HLT")){
                   foundHLT = true ;
                    System.out.println("Found hlt");
               }
               if(foundHLT & !opCodeMatcher.hitEnd()){
                    throw new Errors(18);
               }

               if(!foundHLT /*& opCodeMatcher.hitEnd()*/ & !opCodeMatcher.find()){
                    throw new Errors(9);
               }

                System.out.println("OPcode is : " +opcode);
                System.out.println("Address is " + address);
                p.addEle(opcode, address);

                opcode = "";
                address = null;

            }

            if(! found){
             throw new Errors(19);
           }
        }

        catch(Errors e){
            return -1 ;
        }

        return 0;

    }
//Uncomment the main method to test the file
/**
   public static void main(String [] args){
     Scanner s = new Scanner(System.in);
     Bridge b = new Bridge(s.nextLine());
     b.assembleCode();
     Memory m = new Memory(b.register);
     m.parseInput(b.getP());
     System.out.println(m);
    }
 **/
}

الجزئيه المهمه هنا هي

Pattern misses = Pattern.compile("[^(\\s*(((LDA|SUB)\\s+\\w+)|((OUT|HLT)))\\s*)+]", Pattern.CASE_INSENSITIVE);
        Pattern regAddr = Pattern.compile("\\s*REG\\s*\\w+\\s*\\d+\\s*\\d+\\s*" , Pattern.CASE_INSENSITIVE);
        Pattern code = Pattern.compile("\\s*(((LDA|SUB)\\s+\\w+)|((OUT|HLT))\\s+)\\s*" , Pattern.CASE_INSENSITIVE);

لاحظي استخدام static method compile حيث انها تقوم بعمل النمط الذي سيتم فحص المطابقه عليه

ثم

Matcher regAddrMatcher = regAddr.matcher(input);
        Matcher opCodeMatcher = code.matcher(input);
        Matcher missesMatch = misses.matcher(input);

نقوم بعمل المطابقه

وهذا مثال على قرائتنا للمطابقه

           while(regAddrMatcher.find()){
                System.out.printf("I found the text \"%s\" starting at " +
                               "index %d and ending at index %d.%n",
                               regAddrMatcher.group(), regAddrMatcher.start(), regAddrMatcher.end());

                String s = input.substring(regAddrMatcher.start(), regAddrMatcher.end());
                StringTokenizer tokens = new StringTokenizer(s);
                String reg = tokens.nextToken();
                String varName = tokens.nextToken();
                System.out.println("Variable name is " + varName);
                int varAddress = Integer.parseInt(tokens.nextToken());
                System.out.println("Variable address is " + varAddress);
                int varValue = Integer.parseInt(tokens.nextToken());
                register.RegAddress(varName, varAddress, varValue);
                System.out.println(register);

        }

دراسة الregular expressions قد تاخذ وقت وهناك دروس عليها في المنتدى هنا او في الويب وايضا هناك كتب اهمها Mastering Regular Expressions

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#11

جزاااك رب خير ونفــع بك و بعلمك ...

#12
Pattern misses = Pattern.compile("[^(\\s*(((LDA|SUB)\\s+\\w+)|((OUT|HLT)))\\s*)+]", Pattern.CASE_INSENSITIVE); 
        Pattern regAddr = Pattern.compile("\\s*REG\\s*\\w+\\s*\\d+\\s*\\d+\\s*" , Pattern.CASE_INSENSITIVE); 
        Pattern code = Pattern.compile("\\s*(((LDA|SUB)\\s+\\w+)|((OUT|HLT))\\s+)\\s*" , Pattern.CASE_INSENSITIVE);

مافهمت علي أي أساس طيب أكتب البراميتر لدالة الكمبايلر ...

أنا توقعت الأمر أسهل من كذا ؟؟توقعت نستخدم API ماحاولت أبحث في هذي الأشياء ؟؟

معقوله راح يكوون الايفنت طويل لهذي الدرجــه ؟؟؟؟ مافيه طريقه أسهل من كذاا ؟؟؟؟؟؟؟

رب يسهـــــــــــل

#13

رب يجزااك خير ...

كتبت هذا الكـــود تبع simpletron والدالــه compile في الكلاس machine تقـــوم بربط جميع الدوال في الكلاسات الأخرى "كأنها main methode "

أريــــــــــــــد أن أستدعــي الداله compile داخل الحدث للبوتون run وأريــــد أن يكون الطباعه على التكست أريــأ .....

يعنـــي غيرت فكرة برنامجــي ..بحيث يعمل رن لهذا الكود فقط ,, والفكرره إنه يكتب الكود التالي داخل البدي كونستركتر للفريم ؟؟؟

لم أستـــــطع الربط بينهم ؟؟؟

class JavaApplication39 {



	 private int accumulator; 
     private int instructionCounter; 
     private int instructionRegister; 
     private int operationCode; 
     private int operand; 
     private boolean halt; 
     private MemoryClass memory;  

   // *****     Operation codes     *****   

    // Input/Output operations. 
   	 private final int READ = 10; 
   	 private final int WRITE = 11;   

   	 // Load/Store operations. 
   	 private final int LOAD = 20; 
     private final int STORE = 21;   

      // Arithmetic operations. 
   	 private final int ADD = 30; 
   	 private final int SUBTRACT = 31; 
   	 private final int DIVIDE = 32; 
   	 private final int MULTIPLY = 33;  

     // Transfer-of-control operations.
   	 private final int BRANCH = 40; 
   	 private final int BRANCHNEG = 41; 
   	 private final int BRANCHZERO = 42; 
   	 private final int HALT = 43;



    public JavaApplication39(MemoryClass memory1) 
   {


    	 accumulator = 0;   
         instructionCounter = 0;  
         instructionRegister = 0;   
         operationCode = 0;  
         operand = 0;   
         halt = false;    

         memory = memory1;

    }  
     public  int getOperationCode(int word) 
 	 {   

 	 	 int operationCode = word / 100;  
 	     return operationCode; 
     }   


   public  int getOperand(int word) 
    {   
 	    int operand = word % 100; 
 	    return operand; 
    }   	


  public boolean executeNextInstruction() 
  {   


     if (halt) 
     return false;       

 	  // Read next instruction from memory.  
 	  instructionRegister = memory.read(instructionCounter);  


     operationCode = getOperationCode(instructionRegister);  
     operand =getOperand(instructionRegister);       


     boolean transferOfControl = false;       

     //  execute the instruction.   
    switch (operationCode)  
    {      
   	 case READ:    

   	    	Scanner scan = new Scanner(System.in); 

            // Read a word from the keyboard.       
   	        System.out.print("Enter an integer: ");               

   	        // Write word to memory.       
   	        memory.write(operand, scan.nextInt());     


   	        break;           

   	 case WRITE:        

   	 	   // Read a word from memory.      
   	      int data = memory.read(operand);        

   	       // Display the word on the screen        

   	     if (!halt)
   	       	 System.out.println(data);            

   	      break;            

   	 case LOAD:       

   	 	 // Load a word from memory into the accumulator.      

   	     accumulator = memory.read(operand); //    accumulator=memory[operand]; 

   	     break;


    case STORE:       

    	 // Store accumulator into memory.      

         memory.write(operand, accumulator);  // memory[operand]=accumulator;  


    	 break;             

    case ADD:      

    	  // Add word from memory to accumulator.      

    	   accumulator += memory.read(operand);      


    	   break;             

    case SUBTRACT:       

    	 // Subtract word from memory from accumulator.        

    	   accumulator -= memory.read(operand);       


    	   break;            

   	case DIVIDE:      

   		  // Divide accumulator by a word loaded from memory.      

    	   int divisor = memory.read(operand);   //divisor=memory[oprand] ;  

    	   if (!halt)        
    	     if (divisor == 0)         
            {          
            	  System.out.println("*** Attempt to divide by zero ***");           

    	    }        

    	    else            accumulator /= divisor;        

    	    break;          

    case MULTIPLY:       

    	 // Multiply accumulator by a word loaded from memory.       

    	   accumulator *= memory.read(operand);     


    	   break;       

    case BRANCH:       

    	 // Branch to location in memory.       

    	    instructionCounter = operand;      
    	    transferOfControl = true;       

    	    break;             

    case BRANCHNEG:       

    	 // Branch to location in memory if accumulator is negative.      

           if (accumulator < 0)      
    	  {     
    	  	 instructionCounter = operand;        
    	     transferOfControl = true;     
          }      
    	  break;             

   case BRANCHZERO:       

   	   // Branch to location in memory if accumulator is zero.      

    	   if (accumulator == 0)

          {    
          	instructionCounter = operand;    
            transferOfControl = true;        
          }     

           break;             

    case HALT:           

    	   System.out.println("*** Simpletron execution terminated ***");       
    	   transferOfControl = true;      
    	   halt = true;     

    	   break;           

    default:       

    	 System.out.println("*** Invalid operation code ***");      

    	   halt= true; // break;	



   	     }     



   	  	 if (!transferOfControl) 


   	  	       instructionCounter++; 


   	  return !halt;

   	  }



  public void dump() 
   {   
     	System.out.printf(" accumulator\t\t\t%+05d\n", accumulator); 
   		System.out.printf("instructionCounter\t\t %02d\n", instructionCounter); 
   	    System.out.printf("instructionRegister\t\t%+05d\n",  instructionRegister);
   	    System.out.printf("operationCode \t\t\t %02d\n",  operationCode);  
   	    System.out.printf("operand \t\t\t\t %02d\n",  operand);

    }   





}

/**
 * @(#)MemoryClass.java
 */////////////////////////// *
 * @author 
 * @version 1.00 2011/12/16
 */


 class MemoryClass {

	private int[] memory; 

    public MemoryClass(int amountOfMemoryWord ) 
   {
    	 memory = new int[amountOfMemoryWord];   

    }


     // Write a value to memory.  
    public void write(int word, int value) 
   	{       
   	 	  if (word < 0 || word >= memory.length)  
   	 	  {     
   	 	  	  System.out.println("*** Attempt to write to a non-existing memory location ***");   
   	 	  }

   	 	 else memory[word] = value; 

   	 }   


   	public int read(int word) 

   	{   
   	  	 int value = 0;       
   	 	 if (word < 0 || word >= memory.length)   
   	 	 {      System.out.println("*** Attempt to read from a non-existing  memory location ***");     

   	 	 }   
   	 	 else value = memory[word];     
   	  return value;  

   	}   



   	 public void dump() 
   	{     

   	 	 System.out.print( "   ");  
   	 	 for (int i = 0; i < 10; i++)  
   	 	 System.out.printf("%5d ", i);       

   	 	 System.out.println();       

   	 	 for (int i = 0; i < memory.length; i += 10)   
   	 	 {     
   	 	 	 System.out.print("  "+ i+ " ");     
   	 	 	 for (int j = 0; j < 10 && i+j < memory.length; j++)       
   	 	 	  	    System.out.printf("%+05d ", memory[i + j]); //05>>> to print five digits ???        
   	 	 	  	    System.out.println();   
   	 	  } 
   	 }   


   	 } 
/**
 * @(#)MachineClass.java43
 *
 * * @author 
 * @version 1.00 2011/12/16
 */

 class MachineClass 
 {

   private  MemoryClass memory1;    
   private JavaApplication39 registor1 ;   
   public static final int MEMORY_WORD = 100;



    public MachineClass()
    {  
    	 memory1=new MemoryClass( MEMORY_WORD);
         registor1=new JavaApplication39(memory1);


    }

 public void inputProgramToMemory() 
{   
    Scanner input =new Scanner(System.in);   

    int memoryWord=0;
    final int END_OF_INPUT = -9999;      

    System.out.printf("%02d ? ", memoryWord);
    int data = input.nextInt();

   	while(data !=END_OF_INPUT)      
    {      
       memory1.write(memoryWord,data);
       memoryWord++;
       System.out.printf("%02d ? ", memoryWord);  
       data = input.nextInt();
    }

    	 	   System.out.println("*** Program loading completed ***");
    	 	   System.out.println(); 
    }   





   public void computerDump() 
   {    System.out.println();      
    	System.out.println("REGISTERS:");  
    	registor1.dump();      
    	System.out.println();      
    	System.out.println("MEMORY:");   
        memory1.dump(); 
   }    

   	// Execute program  
    public void executeProgram()
    {   
      	 System.out.println("*** Program execution begins  ***");        

         while (  registor1.executeNextInstruction()) ;       
              computerDump(); 
    }    



}

class machine {

      public  void compile() 

     {  



           System.out.println("*** Welcome to Simpletron! ***");   
    	   System.out.println("*** Please enter your program one instruction   ***");  
    	   System.out.println("*** (or data word) at a time. I will display    ***");   
    	   System.out.println("*** the location number and a question mark (?) ***");  
    	   System.out.println("*** You then type the word for that location.   ***");   
    	   System.out.println("*** Type -99999 to stop entering your program.  ***");   
    	   System.out.println(); 


    	MachineClass machine = new MachineClass ();   
        machine.inputProgramToMemory();  
        machine.executeProgram();


     }

ياليت أذا فيه أحد يقدر يعمل حدث للرن بوتون بحيث يظهر لي الأوت بوت لهذا الكود على التكست أرياا ...

وشكراااا

تم تعديل هذه المشاركة بواسطة sara33 في 12 مايو 2012 في 16:35

#14

اختي بالنسبة لسؤالك الاول : برامتر الداله كومبايل هو الregular expression بذاته ، هذا الاسترينغ اللي بتشوفيه مش مفهوم هو الregular expression وهو له فورمات معين زي مثلا \\d للارقام و \\w للكلمات

مثل ما قلت لك يشتي شويه وقت تفهميه

بالنسبة لمثالك الاخير : انا اعتقد انكي بتحاولي حل سؤال الكومبيلر في كتاب Java How to Program اذا كان الامر كذلك ، اذا استخدمتي الregular expression مافيش داعي تعطي قيمه عدديه لكل رقم

بس اذا انتي بتحليه بالطريقه التقليديه من دون الregular expression يشتي لك عمل if else متداخلات وطويله وفيها تفحص النص من الtext area باستخدام داله الاسترينغ startswith() مثلا

if(textarea.getText().trim.startswith("LOAD"))
//;

شوفي اولا اي طريقه تشتي تستخدمي

تم تعديل هذه المشاركة بواسطة mental-driller في 12 مايو 2012 في 12:50

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#15

أخــي ياليت إذا تقدر تسااعدنــي أبغى الآوت بوت للمثال الأخير يخرج على التكست آريا بعد الضغط على الرن بوتون بدوون إستخداام regural expression وإذا حصلت الفرصه المناسبه بإذن الله راح اتعلمه وأبدأ بالكمباايلر بشكل جديد ..

يااليت يكوون وصلت فكرتــي ؟؟

#16

*- يحظر استخدام اللهجة العامية

*- أو كتابة الأسئلة باللغة الإنجليزية

*- أو كتابة الكلمات الإنجليزية بالعربية

====

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#17
علاء الصالحي كتب:

*- يحظر استخدام اللهجة العامية

*- أو كتابة الأسئلة باللغة الإنجليزية

*- أو كتابة الكلمات الإنجليزية بالعربية

====

أعتـــذر أستاذ عـلاء ... وشكـرا على التنبيـه

سأتفــأدى ذلك بعون الله ....

مواضيع مشابهة