Data Entry এবং Validation

এডাব্লিউটি (AWT) - Java Technologies

342

AWT (Abstract Window Toolkit) হলো Java-র একটি পুরোনো GUI (Graphical User Interface) টুলকিট। এটি GUI কম্পোনেন্ট তৈরি এবং ডেটা এন্ট্রি ও ভ্যালিডেশন করতে ব্যবহার করা হয়। এখানে AWT-র মাধ্যমে ডেটা এন্ট্রি এবং ভ্যালিডেশন সম্পর্কে বিস্তারিত আলোচনা করা হলো:


ডেটা এন্ট্রি

AWT ব্যবহার করে ডেটা এন্ট্রি ফর্ম তৈরি করার জন্য নিম্নলিখিত কম্পোনেন্টগুলো সাধারণত ব্যবহৃত হয়:

  1. Label: ডেটা ইনপুট ক্ষেত্রের নাম দেখানোর জন্য।
  2. TextField: ব্যবহারকারীর ডেটা এন্ট্রি করার জন্য।
  3. Button: ডেটা জমা দেওয়া বা কোনো প্রক্রিয়া শুরু করার জন্য।
  4. Checkbox/RadioButton: অপশন নির্বাচন করার জন্য।
  5. TextArea: একাধিক লাইনের ডেটা ইনপুট করার জন্য।

উদাহরণ: ডেটা এন্ট্রি ফর্ম

import java.awt.*;
import java.awt.event.*;

public class DataEntryForm extends Frame implements ActionListener {
    TextField nameField, ageField;
    Button submitButton;

    public DataEntryForm() {
        // Set Frame Layout
        setLayout(new FlowLayout());

        // Add Labels and TextFields
        add(new Label("Name:"));
        nameField = new TextField(20);
        add(nameField);

        add(new Label("Age:"));
        ageField = new TextField(5);
        add(ageField);

        // Add Submit Button
        submitButton = new Button("Submit");
        add(submitButton);

        // Add Action Listener
        submitButton.addActionListener(this);

        // Frame Settings
        setTitle("AWT Data Entry Form");
        setSize(300, 200);
        setVisible(true);
    }

    // Action Listener Implementation
    public void actionPerformed(ActionEvent e) {
        String name = nameField.getText();
        String age = ageField.getText();
        System.out.println("Name: " + name + ", Age: " + age);
    }

    public static void main(String[] args) {
        new DataEntryForm();
    }
}

ডেটা ভ্যালিডেশন

ডেটা ভ্যালিডেশনের মাধ্যমে নিশ্চিত করা হয় যে ব্যবহারকারী সঠিক এবং প্রত্যাশিত ডেটা ইনপুট করছে। AWT-তে ডেটা ভ্যালিডেশন সাধারণত ActionListener বা KeyListener ব্যবহার করে করা হয়।

উদাহরণ: ভ্যালিডেশন

import java.awt.*;
import java.awt.event.*;

public class DataValidationForm extends Frame implements ActionListener {
    TextField nameField, ageField;
    Label errorLabel;
    Button submitButton;

    public DataValidationForm() {
        // Layout setup
        setLayout(new FlowLayout());

        // Name Input
        add(new Label("Name:"));
        nameField = new TextField(20);
        add(nameField);

        // Age Input
        add(new Label("Age:"));
        ageField = new TextField(5);
        add(ageField);

        // Error Label
        errorLabel = new Label();
        errorLabel.setForeground(Color.RED);
        add(errorLabel);

        // Submit Button
        submitButton = new Button("Submit");
        add(submitButton);
        submitButton.addActionListener(this);

        // Frame Settings
        setTitle("AWT Data Validation Form");
        setSize(300, 200);
        setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
        String name = nameField.getText().trim();
        String ageText = ageField.getText().trim();

        // Validation Logic
        if (name.isEmpty()) {
            errorLabel.setText("Name cannot be empty.");
            return;
        }

        try {
            int age = Integer.parseInt(ageText);
            if (age <= 0) {
                errorLabel.setText("Age must be a positive number.");
                return;
            }
        } catch (NumberFormatException ex) {
            errorLabel.setText("Age must be a valid number.");
            return;
        }

        errorLabel.setText("Validation Successful!");
        System.out.println("Name: " + name + ", Age: " + ageText);
    }

    public static void main(String[] args) {
        new DataValidationForm();
    }
}

AWT-এর সুবিধা ও সীমাবদ্ধতা

সুবিধা:

  1. সহজ এবং হালকা-ওজন।
  2. প্রাথমিক GUI অ্যাপ্লিকেশন তৈরির জন্য আদর্শ।
  3. বিভিন্ন প্ল্যাটফর্মে সাপোর্ট।

সীমাবদ্ধতা:

  1. সীমিত স্টাইল এবং আধুনিক ডিজাইন সমর্থন।
  2. Swing এবং JavaFX-এর তুলনায় কম ক্ষমতাশালী।
  3. কাস্টমাইজেশন জটিল।

AWT এখনও প্রাথমিক GUI শেখার জন্য এবং ছোটখাটো টুল তৈরির জন্য ব্যবহৃত হয়। তবে, আধুনিক জাভা অ্যাপ্লিকেশনের জন্য Swing বা JavaFX বেশি জনপ্রিয়।

Content added By

AWT (Abstract Window Toolkit) হলো জাভা GUI (Graphical User Interface) এর একটি অংশ, যা দিয়ে উইন্ডো-ভিত্তিক অ্যাপ্লিকেশন তৈরি করা যায়। TextField এবং TextArea হলো AWT এর গুরুত্বপূর্ণ কম্পোনেন্ট, যা ব্যবহারকারীর কাছ থেকে ডেটা ইনপুট নিতে ব্যবহৃত হয়। নিচে এদের বিস্তারিত আলোচনা করা হলো:


TextField

  1. ব্যাখ্যা:
    TextField হলো এক লাইনের টেক্সট ইনপুট করার জন্য একটি GUI কম্পোনেন্ট। এটি সাধারণত ব্যবহারকারীর কাছ থেকে নাম, ইমেইল, বা অন্য কোনো ছোটো তথ্য ইনপুট নিতে ব্যবহৃত হয়।
  2. গুরুত্বপূর্ণ মেথডসমূহ:
    • getText(): ইনপুট ডেটা রিটার্ন করে।
    • setText(String text): TextField-এ কোনো ডিফল্ট টেক্সট সেট করে।
    • addActionListener(ActionListener l): TextField-এ অ্যাকশন লিস্টেনার যুক্ত করে।
  3. উদাহরণ কোড:

    import java.awt.*;
    import java.awt.event.*;
    
    public class TextFieldExample {
        public static void main(String[] args) {
            Frame frame = new Frame("TextField Example");
    
            TextField tf = new TextField();
            tf.setBounds(50, 50, 200, 30);
    
            Button button = new Button("Show");
            button.setBounds(50, 100, 80, 30);
    
            Label label = new Label();
            label.setBounds(50, 150, 200, 30);
    
            button.addActionListener(e -> label.setText("Input: " + tf.getText()));
    
            frame.add(tf);
            frame.add(button);
            frame.add(label);
    
            frame.setSize(300, 300);
            frame.setLayout(null);
            frame.setVisible(true);
        }
    }
    

TextArea

  1. ব্যাখ্যা:
    TextArea হলো একাধিক লাইনের টেক্সট ইনপুট বা ডিসপ্লে করার জন্য ব্যবহৃত একটি কম্পোনেন্ট। এটি সাধারণত ব্যবহারকারীর কাছ থেকে বড়ো পরিমাণ ডেটা ইনপুট নিতে বা মেসেজ দেখাতে ব্যবহৃত হয়।
  2. গুরুত্বপূর্ণ মেথডসমূহ:
    • getText(): ইনপুট ডেটা রিটার্ন করে।
    • setText(String text): TextArea-তে কোনো ডিফল্ট টেক্সট সেট করে।
    • append(String text): বিদ্যমান টেক্সটের শেষে নতুন টেক্সট যোগ করে।
  3. উদাহরণ কোড:

    import java.awt.*;
    import java.awt.event.*;
    
    public class TextAreaExample {
        public static void main(String[] args) {
            Frame frame = new Frame("TextArea Example");
    
            TextArea ta = new TextArea();
            ta.setBounds(50, 50, 300, 150);
    
            Button button = new Button("Show Text");
            button.setBounds(50, 220, 80, 30);
    
            Label label = new Label();
            label.setBounds(50, 270, 300, 30);
    
            button.addActionListener(e -> label.setText("Input: " + ta.getText()));
    
            frame.add(ta);
            frame.add(button);
            frame.add(label);
    
            frame.setSize(400, 400);
            frame.setLayout(null);
            frame.setVisible(true);
        }
    }
    

TextField এবং TextArea এর পার্থক্য

বৈশিষ্ট্যTextFieldTextArea
লাইন সংখ্যাএক লাইন ইনপুটএকাধিক লাইন ইনপুট
ব্যবহারসংক্ষিপ্ত তথ্যের জন্যবড়ো মাপের টেক্সট ইনপুটের জন্য
স্ক্রলবারসাধারণত থাকে নাস্ক্রলবার থাকতে পারে

এই উদাহরণগুলো অনুসরণ করে আপনি AWT-তে TextField এবং TextArea ব্যবহার করে ডেটা এন্ট্রি সম্পর্কিত কার্যক্রম তৈরি করতে পারবেন।

Content added By

AWT (Abstract Window Toolkit) এ ফর্ম ভ্যালিডেশন এবং এরর মেসেজ প্রদর্শন করার জন্য আপনি সাধারণত ব্যবহার করবেন TextField, Button, এবং Label কম্পোনেন্ট। ফর্ম ভ্যালিডেশন মূলত ব্যবহারকারীর ইনপুট চেক করার একটি প্রক্রিয়া, যেমন প্রয়োজনীয় ফিল্ড পূর্ণ হয়েছে কিনা, ইনপুট সঠিক ফরম্যাটে আছে কিনা, ইত্যাদি। যখন কোনো ইনপুট ভুল থাকে, তখন একটি এরর মেসেজ প্রদর্শন করতে হয়।

এখানে একটি উদাহরণ দেওয়া হলো যেখানে একটি সিম্পল ফর্ম তৈরি করা হয়েছে এবং ইনপুট ভ্যালিডেশন করা হয়েছে:

উদাহরণ: ফর্ম ভ্যালিডেশন এবং এরর মেসেজ প্রদর্শন

import java.awt.*;  
import java.awt.event.*;  

public class FormValidationExample extends Frame implements ActionListener {  

    // কম্পোনেন্ট ডিক্লেয়ার
    Label nameLabel, emailLabel, errorLabel;
    TextField nameField, emailField;
    Button submitButton;  
    
    public FormValidationExample() {  
        // লেবেল সেটআপ
        nameLabel = new Label("Name:");  
        emailLabel = new Label("Email:");  
        errorLabel = new Label();  
        errorLabel.setForeground(Color.RED);  // এরর মেসেজের জন্য লাল রঙ

        // টেক্সটফিল্ড সেটআপ
        nameField = new TextField();  
        emailField = new TextField();  

        // বাটন সেটআপ
        submitButton = new Button("Submit");  
        submitButton.addActionListener(this);  // বাটন ক্লিক হলে অ্যাকশন ট্রিগার হবে

        // কম্পোনেন্টগুলোর অবস্থান সেট করা
        nameLabel.setBounds(50, 50, 100, 30);  
        nameField.setBounds(150, 50, 200, 30);  
        emailLabel.setBounds(50, 100, 100, 30);  
        emailField.setBounds(150, 100, 200, 30);  
        submitButton.setBounds(150, 150, 100, 30);  
        errorLabel.setBounds(50, 200, 300, 30);

        // ফ্রেমে কম্পোনেন্ট যোগ করা
        add(nameLabel);  
        add(nameField);  
        add(emailLabel);  
        add(emailField);  
        add(submitButton);  
        add(errorLabel);  

        // ফ্রেমের সাইজ এবং ভিজিবিলিটি
        setSize(400, 300);  
        setLayout(null);  
        setVisible(true);  
    }  
    
    // ActionListener ইন্টারফেসের মেথড
    public void actionPerformed(ActionEvent e) {  
        String name = nameField.getText();  
        String email = emailField.getText();  

        // ফর্ম ভ্যালিডেশন
        if (name.isEmpty() || email.isEmpty()) {  
            errorLabel.setText("All fields must be filled out!");  // এরর মেসেজ
        } else if (!email.contains("@")) {  
            errorLabel.setText("Invalid email address!");  // ইমেইল ভ্যালিডেশন
        } else {  
            errorLabel.setText("");  // যদি সব ঠিক থাকে, তাহলে কোন এরর মেসেজ থাকবে না
            // এখানে আপনি ফর্ম সাবমিট করার পরবর্তী কার্যক্রম চালাতে পারেন
            System.out.println("Form submitted successfully!");
        }  
    }  

    public static void main(String[] args) {  
        new FormValidationExample();  
    }  
}

কোডের ব্যাখ্যা:

  1. কম্পোনেন্ট তৈরি:
    • Label, TextField, এবং Button কম্পোনেন্ট তৈরি করা হয়েছে।
    • nameLabel এবং emailLabel টেক্সট ফিল্ডের জন্য লেবেল হিসেবে কাজ করবে।
    • nameField এবং emailField ব্যবহারকারীর ইনপুট নেবে।
    • submitButton ব্যবহারকারী যখন ফর্ম সাবমিট করতে চাইবে তখন ক্লিক করবে।
    • errorLabel ব্যবহারকারীর ভুল ইনপুট হলে একটি এরর মেসেজ দেখাবে।
  2. ভ্যালিডেশন:
    • প্রথমে চেক করা হয় যে, name এবং email ফিল্ড ফাঁকা কি না।
    • তারপর চেক করা হয় যে, email ফিল্ডে একটি সঠিক ইমেইল ফরম্যাট আছে কি না (যেমন @ সাইন উপস্থিত থাকা উচিত)।
  3. এরর মেসেজ প্রদর্শন:
    • যদি কোনো ইনপুট ভুল থাকে, errorLabel এ একটি রেড কালারের এরর মেসেজ দেখানো হয়।
    • যদি ইনপুট সঠিক থাকে, errorLabel পরিষ্কার করা হয় এবং ফর্ম সাবমিট করার পরবর্তী কার্যক্রম চালানো যেতে পারে।

ফলাফল:

  • যখন আপনি Submit বাটনে ক্লিক করবেন, যদি কোনো ইনপুট ফাঁকা থাকে বা ইমেইল ভুল ফরম্যাটে থাকে, তাহলে একটি এরর মেসেজ দেখাবে।
  • যদি সব কিছু ঠিক থাকে, তাহলে "Form submitted successfully!" টেক্সট কনসোলে প্রদর্শিত হবে এবং এরর মেসেজটি মুছে যাবে।
Content added By

AWT (Abstract Window Toolkit) ব্যবহার করে Java-তে Number এবং Date ফরম্যাটের Validation করার জন্য, আপনি সাধারণত TextField কম্পোনেন্ট ব্যবহার করেন এবং ব্যবহারকারী যে ইনপুট দিচ্ছে তা যাচাই করতে পারেন। Validation প্রক্রিয়াটি নিশ্চিত করে যে ব্যবহারকারী সঠিক ফরম্যাটে ডেটা ইনপুট করছে। নিচে Number এবং Date ফরম্যাটের Validation কিভাবে করতে হয় তা উদাহরণ দিয়ে দেখানো হলো।

1. Number ফরম্যাটের Validation:

TextField কম্পোনেন্টে ব্যবহারকারীর ইনপুট নিন এবং তারপর যাচাই করুন যে ইনপুটটি একটি বৈধ সংখ্যা কিনা। এর জন্য আপনি try-catch ব্লক বা NumberFormatException ব্যবহার করতে পারেন।

উদাহরণ:

import java.awt.*;
import java.awt.event.*;
import java.text.*;
import javax.swing.*;

public class NumberValidationExample extends Frame implements ActionListener {
    
    TextField numberField;
    Label resultLabel;
    
    public NumberValidationExample() {
        setLayout(new FlowLayout());
        
        numberField = new TextField(20);
        Button validateButton = new Button("Validate Number");
        resultLabel = new Label();
        
        add(new Label("Enter a number:"));
        add(numberField);
        add(validateButton);
        add(resultLabel);
        
        validateButton.addActionListener(this);
        
        setSize(300, 150);
        setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String input = numberField.getText();
        try {
            // Attempt to parse the number
            Double.parseDouble(input);
            resultLabel.setText("Valid Number");
        } catch (NumberFormatException ex) {
            resultLabel.setText("Invalid Number");
        }
    }
    
    public static void main(String[] args) {
        new NumberValidationExample();
    }
}

ব্যাখ্যা:

  • এখানে, ব্যবহারকারী যখন একটি সংখ্যা ইনপুট করবে এবং "Validate Number" বোতামটি ক্লিক করবে, তখন Double.parseDouble() মেথডটি চেষ্টা করবে ইনপুটটিকে একটি ডাবল মানে রূপান্তর করতে।
  • যদি ইনপুটটি একটি বৈধ সংখ্যা না হয়, তাহলে NumberFormatException ত্রুটি হবে এবং ফলস্বরূপ "Invalid Number" প্রদর্শিত হবে।

2. Date ফরম্যাটের Validation:

TextField কম্পোনেন্টে ব্যবহারকারীর ইনপুটকে নির্দিষ্ট একটি তারিখের ফরম্যাটে যাচাই করতে পারেন। উদাহরণস্বরূপ, আপনি যদি "dd/MM/yyyy" ফরম্যাটে তারিখ চান, তবে SimpleDateFormat ব্যবহার করতে পারেন।

উদাহরণ:

import java.awt.*;
import java.awt.event.*;
import java.text.*;
import java.util.*;

public class DateValidationExample extends Frame implements ActionListener {
    
    TextField dateField;
    Label resultLabel;
    
    public DateValidationExample() {
        setLayout(new FlowLayout());
        
        dateField = new TextField(20);
        Button validateButton = new Button("Validate Date");
        resultLabel = new Label();
        
        add(new Label("Enter a date (dd/MM/yyyy):"));
        add(dateField);
        add(validateButton);
        add(resultLabel);
        
        validateButton.addActionListener(this);
        
        setSize(300, 150);
        setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String input = dateField.getText();
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        sdf.setLenient(false);  // Disable lenient parsing
        
        try {
            Date date = sdf.parse(input); // Try to parse the date
            resultLabel.setText("Valid Date");
        } catch (ParseException ex) {
            resultLabel.setText("Invalid Date");
        }
    }
    
    public static void main(String[] args) {
        new DateValidationExample();
    }
}

ব্যাখ্যা:

  • এখানে SimpleDateFormat ক্লাসের মাধ্যমে তারিখের ফরম্যাট নির্দিষ্ট করা হয়েছে ("dd/MM/yyyy")।
  • setLenient(false) ব্যবহার করা হয়েছে, যাতে ফরম্যাটের বাইরে কিছু ইনপুট দিলে তা গ্রহণ না করা হয় (যেমন, 32/13/2024 ইত্যাদি)।
  • যদি ইনপুটটি সঠিক তারিখ ফরম্যাটে না থাকে, তবে ParseException ছুড়ে দেবে এবং "Invalid Date" প্রদর্শিত হবে।
  • Number Validation: Double.parseDouble() অথবা Integer.parseInt() ব্যবহার করে সংখ্যা যাচাই করা যায়।
  • Date Validation: SimpleDateFormat.parse() ব্যবহার করে নির্দিষ্ট তারিখ ফরম্যাট যাচাই করা যায়।
Content added By

Java AWT (Abstract Window Toolkit) ব্যবহার করে Custom Input Validator তৈরি করার জন্য আপনি ব্যবহারকারীর ইনপুট যাচাই করার জন্য কাস্টম মেথড তৈরি করতে পারেন। সাধারণত, ইনপুট ফিল্ডের মধ্যে কাস্টম ভ্যালিডেশন করতে TextField, TextArea, বা অন্যান্য ইনপুট কম্পোনেন্টের উপর KeyListener বা FocusListener ব্যবহার করা হয়।

এখানে AWT-এ Custom Input Validator তৈরি করার একটি উদাহরণ দেওয়া হলো, যেখানে আমরা TextField-এ কাস্টম ইনপুট ভ্যালিডেশন যুক্ত করেছি:

উদাহরণ: Custom Input Validator

import java.awt.*;
import java.awt.event.*;

public class CustomInputValidator extends Frame implements KeyListener {
    // UI Components
    private TextField inputField;
    private Label messageLabel;

    public CustomInputValidator() {
        // Initialize components
        inputField = new TextField();
        inputField.setBounds(50, 50, 200, 30);
        
        messageLabel = new Label();
        messageLabel.setBounds(50, 100, 300, 30);
        
        // Add KeyListener to inputField to handle live validation
        inputField.addKeyListener(this);
        
        // Frame setup
        add(inputField);
        add(messageLabel);
        
        setSize(400, 200);
        setLayout(null);
        setVisible(true);
    }

    // KeyListener method to validate input
    @Override
    public void keyPressed(KeyEvent e) {
        // Custom validation logic (e.g., only numeric input allowed)
        String inputText = inputField.getText();
        
        // Validate if input contains only numbers
        if (!inputText.matches("[0-9]+")) {
            messageLabel.setText("Invalid input! Only numbers are allowed.");
        } else {
            messageLabel.setText("Valid input.");
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        // Optional: Handle key release event if needed
    }

    @Override
    public void keyTyped(KeyEvent e) {
        // Optional: Handle key typed event if needed
    }

    public static void main(String[] args) {
        new CustomInputValidator();
    }
}

কোড ব্যাখ্যা:

  1. TextField and Label:
    • TextField ব্যবহার করা হয়েছে ইনপুট নেওয়ার জন্য এবং Label ব্যবহার করা হয়েছে ভ্যালিডেশন বার্তা দেখানোর জন্য।
  2. KeyListener:
    • KeyListener ইন্টারফেসের keyPressed মেথডে কাস্টম ইনপুট ভ্যালিডেশন যুক্ত করা হয়েছে। এখানে, আমরা শুধু সংখ্যা ইনপুটকে অনুমতি দিচ্ছি।
    • matches("[0-9]+") ব্যবহার করে চেক করা হচ্ছে ইনপুট শুধুমাত্র ডিজিট আছে কিনা। অন্য কোনো অক্ষর হলে, একটি ত্রুটি বার্তা প্রদর্শিত হয়।
  3. Real-time Validation:
    • KeyListener ব্যবহার করা হয়েছে যাতে ইনপুটের প্রতিটি পরিবর্তন সঠিকভাবে চেক করা যায়।
  4. Customization:
    • আপনি ভ্যালিডেশনের জন্য নিজের নিয়মগুলি তৈরি করতে পারেন (যেমন ইমেইল ভ্যালিডেশন, ফোন নাম্বার ভ্যালিডেশন, বা যেকোনো বিশেষ নিয়ম অনুসারে ইনপুট যাচাই করা)।

কাস্টম ইনপুট ভ্যালিডেশনের অন্যান্য উদাহরণ:

  • ইমেইল ভ্যালিডেশন:
    • inputText.matches("^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$")
  • ফোন নাম্বার ভ্যালিডেশন:
    • inputText.matches("\\d{10}")

Optional: FocusListener দিয়ে ভ্যালিডেশন:

আপনি যদি TextField এর ফোকাস হারানোর পর ইনপুট যাচাই করতে চান, তবে FocusListener ব্যবহার করতে পারেন।

inputField.addFocusListener(new FocusListener() {
    @Override
    public void focusGained(FocusEvent e) {
        // Handle focus gained event
    }

    @Override
    public void focusLost(FocusEvent e) {
        // Custom validation when focus is lost
        String inputText = inputField.getText();
        if (!inputText.matches("[0-9]+")) {
            messageLabel.setText("Invalid input! Only numbers are allowed.");
        } else {
            messageLabel.setText("Valid input.");
        }
    }
});

AWT ব্যবহার করে Custom Input Validator তৈরি করার জন্য KeyListener, FocusListener বা অন্যান্য ইভেন্ট লিসনার ব্যবহার করা যেতে পারে। আপনি কাস্টম নিয়ম তৈরি করে বিভিন্ন ধরনের ইনপুট ভ্যালিডেশন করতে পারবেন, যা আপনার অ্যাপ্লিকেশনকে আরও নিরাপদ ও ব্যবহারকারী বান্ধব করে তুলবে।

Content added By
Promotion

Are you sure to start over?

Loading...