Модераторы: javastic, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Принцип смены содержимого экрана? 
:(
    Опции темы
Kalisnik
Дата 1.1.2012, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 21.6.2011

Репутация: нет
Всего: нет



Допустим есть у меня форма с кнопками и текстовыми полями. Одна из кнопок формы должна вывести на экран новые кнопки и текстовые поля. Какова логика этого действа? Мне нужно создать две формы и поочередно выводить их на дисплей?
PM MAIL   Вверх
Pawl
Дата 9.1.2012, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: нет
Всего: 28



Цитата(Kalisnik @  1.1.2012,  22:48 Найти цитируемый пост)
Мне нужно создать две формы и поочередно выводить их на дисплей

Да, именно так. Создаешь класс - наследник Form и реализуешь в нем интерфейс CommandListener (например, 
Код

class MyForm extends Form implements CommandListener)
. В его конструктор передаешь из другой формы (которая вызывает данную) объект Display
Код

public MyForm(Display display, Displayable d)
 ). Где Displayable d - объект вызывающей формы. Далее в MyForm создаешь метод (например, show()) в котором должно быть примерно следующее:
Код

    public void show() {
        setCommandListener(this);
        display.setCurrent(settings);
    }

Первая команда ассоциирует слушатель событий с объектом MyForm, вторая - позволяет отобразить MyForm на мониторе. Этот метод надо вызвать в вызывающей форме, к примеру, как реакцию на нажатие в ней какой-нибудь кнопки, после чего MyForm и отобразится. CommandListener может понадобиться при возврате обратно в вызывающую форму:
Код

public void commandAction(Command cmd, Displayable dspl) {
...        
    if (cmd == BACK) {
        display.setCurrent(d);
    }
}


Добавлено через 3 минуты и 59 секунд
ой, опечатался! В методе show надо писать
Код

...
display.setCurrent(this);


Добавлено через 7 минут и 56 секунд
В принципе, можно даже в вызывающе форме создать объект myForm класса MyForm и там же вызвать метод display.setCurrent(myForm) - результат будет тот же, но тогда 
Код

setCommandListener(this);
 надо писать в конструкторе MyForm.


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Kalisnik
Дата 12.1.2012, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 21.6.2011

Репутация: нет
Всего: нет



Спасибо за подробный и доступный ответ! Я только начал осваивать Java и JavaME в том числе, так что думаю эта веточка форума еще оживится в самое ближайшее время. smile
PM MAIL   Вверх
PiyodaiSiyo
Дата 8.2.2012, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 31.12.2009

Репутация: 1
Всего: 2



А еще лучше общий Listener в мидлете  чтоб ловил и  команды и Displayable(от какой Form пришла команда)
PM MAIL   Вверх
oxigen
Дата 9.2.2012, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 12.4.2010

Репутация: 4
Всего: 4



Далеко не всегда это оправдано. 
Вводить дополнительный listener, который должен знать обо всех формах и как с какой и куда переходить.

Ведь действительно часто нужно по кнопке BACK вернуть предыдущую форму.

А значит этот listener должен знать не только какая форма открыта сейчас, но и какая была открыта перед ней,
чтоб обеспечить возврат. А значит нужно как-то продумывать, чтоб он всегда знал о смене текущей формы...

Можно, но излишних сложностей много.

Это сообщение отредактировал(а) oxigen - 9.2.2012, 18:30
PM MAIL   Вверх
PiyodaiSiyo
Дата 19.2.2012, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 31.12.2009

Репутация: 1
Всего: 2



Цитата

Можно, но излишних сложностей много.

допустим у вас формы-поля в мидлете :frm1,frm2,....,frmN.
(также все они являются потомками "деда" Displayable)
в обработчике (один ! на все формы) мидлета после каждого уловленного события вы знаете от кого пришло событие по параметру Displayable d,а также по параметру Command c что за команда.
вы же фильтруете в мидлете ,скажем 
Код

if(c==back && d==frmX){
  frmX.doSomeEntirePublicMethod();// понятно что весь этот рутинный метод расписан в классе FormX;
  display.setCurrent(frmX_1); //предыдущий или желательный дисплэйэбл
  frmX_1.setComListener(this)// ну можно и слушатель прикрутить здесь же
}

вуаля все как на ладони никакой "статики" все "закапсулированно"...
я не пойму как еще проще организовать,тем более что такая схема была предложена
 у Пирумяна,вспомните...

Это сообщение отредактировал(а) PiyodaiSiyo - 19.2.2012, 01:44
PM MAIL   Вверх
oxigen
Дата 22.2.2012, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 12.4.2010

Репутация: 4
Всего: 4



Простой пример.
Есть 2 формы frm1 и frm2. У каждой в меню есть пункт "settings" по которому показываем форму settingsFrm.
В форме settingsFrm есть пункт "back", по которому вы должны вернуться на ту форму, из которой была открыта settings

И как это реализовать?

Код

if(c == back && d == settingsFrm){
  display.setCurrent(????); //откуда мы узнаем была settingsFrm открыта из frm1 или из frm2?
}


Да, конечно мы можем в листенере по нажатию на settings сохранять текущую форму и восстанавливать по back именно ее.
Код

Displayable prevFrm;
...
if(c == settings){
  prevFrm = d;
  display.setCurrent(settingsFrm);
}
if(c == back && d == settingsFrm){
  display.setCurrent(prevFrm); 
}

Но:
- это как раз излишняя сложность - хранить в листенере дополнительные данные о предыдущей форме. (это в простом примере только об одной)
- это будет работать ТОЛЬКО если settingsFrm будет открываться через меню. А она может и по какому-то событию открываться.




Это сообщение отредактировал(а) oxigen - 22.2.2012, 12:59
PM MAIL   Вверх
Kalisnik
Дата 27.2.2012, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 21.6.2011

Репутация: нет
Всего: нет



Ух! - вернулся. Получилось так что с последнего поста Джаву я забросил. Но, теперь я вновь с вами! smile Почитал все что написано выше. Не знаю что я понял в моем посте от 12.1.2012, но то что написано я не сделал. smile Если Pawl приведет полный пример, думаю я смогу понять. ) Пока сделал по своему. Работает. Ниже я приведу код всей программки, которая реализует навигацию по формам с одним общим слушателем и алгоритмом возврата на предыдущую форму. Это мой первый код на ООП после "Hello World!", так что судите СТРОГО! До этого я писал скрипты на процедурном, скриптовом языке AutoIt. Что я хочу? Покажите мне мои ошибки. Что я считаю за ошибку? Излишне громоздкий код, занимающий больше ресурсов чем мог бы. Плюс стиль письма и логика кода. Код должен быть максимум лаконичен, красив, быстр. Касательно логики, я решил каждую форму и все связанные с этой формой действия поместить в отдельный класс - что об этом думаете? 

oxigen, я не знаю какие Вы увидели сложности. Я реализовал возврат на предыдущую форму с помощью стека - логика придельно проста. В коде ниже можно посмотреть. smile
P.S. Если переход на следующую форму идет по какому-то событию, а не через меню формы, то это же событие и будет запихивать информацию о текущей форме все в тот же стек.

Все классы находятся в пакете newpackage:

файл Midlet.java (главный класс)
Код

package newpackage;

import java.util.Stack;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;

public class Midlet extends MIDlet implements CommandListener {
    
    public static Midlet midl;
    Command exit;
    Command ok;
    Command back;
    
    Display display;
    Stra str;
    Stra2 str2;
    Stra3 str3;
    Stack stack;
    
    private boolean choiceAllForm(int i, Displayable d){
        boolean retr = false;
        if(str.form == d){
            retr = str.choice.isSelected(i);
        }else if(str2.form == d){
            retr = str2.choice.isSelected(i);
        }else if(str3.form == d){
            retr = str3.choice.isSelected(i);
        }
        return retr;
    }
    
    public void startApp() {
        midl = this;
        
        exit = new Command("Выход", Command.EXIT, 0);
        ok = new Command("Далее", Command.OK, 0);
        back = new Command("Назад", Command.BACK, 0);
        
        display = Display.getDisplay(this);
        str = new Stra();
        str2 = new Stra2();
        str3 = new Stra3();
        str.form.setCommandListener(this);
        str2.form.setCommandListener(this);
        str3.form.setCommandListener(this);
        display.setCurrent(str.form);
        
        stack = new Stack();
    }
    
    public void pauseApp() {
    }
    
    public void destroyApp(boolean unconditional) {
        notifyDestroyed();
    }

    public void commandAction(Command c, Displayable d) {
        if(c == exit){
            destroyApp(true);
        }else if(c == back){
            if(!stack.empty()){
                display.setCurrent((Displayable)stack.pop());
            }
            
        }else if(c == ok && choiceAllForm(0, d)){
            stack.push(d);
            display.setCurrent(str.form);
        }else if(c == ok && choiceAllForm(1, d)){
            stack.push(d);
            display.setCurrent(str2.form);
        }else if(c == ok && choiceAllForm(2, d)){
            stack.push(d);
            display.setCurrent(str3.form);
        }
        
    }
}


Файл Stra.java
Код

package newpackage;

import javax.microedition.lcdui.*;

public class Stra {
    
    Form form;
    ChoiceGroup choice;
    
    Stra() {
        form = new Form("Форма 1");
        choice = new ChoiceGroup("Выбор формы: ", ChoiceGroup.POPUP);
        choice.append("один", null);
        choice.append("два", null);
        choice.append("три", null);
        choice.setLayout(Item.LAYOUT_LEFT);
        form.append(choice);
        form.addCommand(Midlet.midl.back);
        form.addCommand(Midlet.midl.ok);
        form.addCommand(Midlet.midl.exit);
    }

}


Файл Stra2.java
Код

package newpackage;

import javax.microedition.lcdui.*;

public class Stra2 {
    
    Form form;
    ChoiceGroup choice;
    
    Stra2() {
        form = new Form("Форма 2");
        choice = new ChoiceGroup("Выбор формы: ", ChoiceGroup.POPUP);
        choice.append("один", null);
        choice.append("два", null);
        choice.append("три", null);
        choice.setLayout(Item.LAYOUT_LEFT);
        form.append(choice);
        form.addCommand(Midlet.midl.back);
        form.addCommand(Midlet.midl.ok);
        form.addCommand(Midlet.midl.exit);
    }
}



Файл Stra3.java
Код

package newpackage;

import javax.microedition.lcdui.*;

public class Stra3 {
    
    Form form;
    ChoiceGroup choice;
    
    Stra3() {
        form = new Form("Форма 3");
        choice = new ChoiceGroup("Выбор формы: ", ChoiceGroup.POPUP);
        choice.append("один", null);
        choice.append("два", null);
        choice.append("три", null);
        choice.setLayout(Item.LAYOUT_LEFT);
        form.append(choice);
        form.addCommand(Midlet.midl.back);
        form.addCommand(Midlet.midl.ok);
        form.addCommand(Midlet.midl.exit);
    }
}



Это сообщение отредактировал(а) Kalisnik - 27.2.2012, 16:13
PM MAIL   Вверх
oxigen
Дата 29.2.2012, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 12.4.2010

Репутация: 4
Всего: 4



Сложность будет в сложном приложении.
Тут у Вас фактически паттерн MVC (Model-View-Controller) используется. 
Model - стек
View - Stra* классы
Controller - мидлет.

А MVC нужно использовать очень аккуратно и только когда без этого уж никак.
Потому что он имеет нехорошее свойство - Controller разростается с дикой скоростью и очень быстро становится категорически нечитаемым.
Сам однажды столкнулся с таким приложением. Само приложение было не то чтоб сильно сложным, но в контроллере метод переключения между формами перевалил за пол-тысячи строк и имел 5 или 6 уровней вложености.

Ну да ладно, для простых приложений это не существенно.

По поводу ООП:

1. Три абсолютно одинаковых класса  Stra, Stra2 и Stra3. Это не нужно.
Достаточно одного.

Код

class Stra {
    
    Form form;
    ChoiceGroup choice;
    
    Stra(String formTitle) {
        form = new Form(formTitle);
        choice = new ChoiceGroup("Выбор формы: ", ChoiceGroup.POPUP);
        choice.append("один", null);
        choice.append("два", null);
        choice.append("три", null);
        choice.setLayout(Item.LAYOUT_LEFT);
        form.append(choice);
        form.addCommand(Midlet.midl.back);
        form.addCommand(Midlet.midl.ok);
        form.addCommand(Midlet.midl.exit);
    }
}

//И потом создаете их
         str = new Stra("Form1");
        str2 = new Stra("Form2");
        str3 = new Stra("Form3");


2. Никогда не обращайтесь напрямую к полям класса.
Код

 str3.form.setCommandListener(this); 

За такое будут больно бить по рукам. Все поля класса всегда должны быть объявлены как private (иногда protected - при использовании наследования) и доступ к ним только через геттеры и сеттеры.
Объяснить зачем это не так просто, просто примите это. Как то, что дорогу можно переходить только на зеленый свет.

Код

class Stra {
  private Form form;

  public Form getForm() {
     return form;
 }
  // Использование
   str3.getForm().setCommandListener(this); 
}


3. Классы Stra* нужны ли вообще? Обертка вокруг формы, которая ничего по сути не делает. Тут больше подойдет наследование.

Код

class Stra extends Form  {
    ChoiceGroup choice;
    
    Stra(String formTitle) {
        super(formTitle);
        choice = new ChoiceGroup("Выбор формы: ", ChoiceGroup.POPUP);
        choice.append("один", null);
        choice.append("два", null);
        choice.append("три", null);
        choice.setLayout(Item.LAYOUT_LEFT);
        append(choice);
        addCommand(Midlet.midl.back);
        addCommand(Midlet.midl.ok);
        addCommand(Midlet.midl.exit);
    }
//И там где используете уже не нужно получать form от Stra. Потому что Stra теперь и есть Form.
        str.setCommandListener(this);
        str2.setCommandListener(this);
        str3.setCommandListener(this);
}




Это сообщение отредактировал(а) oxigen - 29.2.2012, 15:42
PM MAIL   Вверх
Kalisnik
Дата 29.2.2012, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 21.6.2011

Репутация: нет
Всего: нет



oxigen, огромнейшее спасибо! Ваш крайний пост содержит бесценную информацию для моего дальнейшего понимания Java и вообще концепции ООП. Все изложенно крайне доступно, лаконично, ни чего лишнего. По Вашим постам лекции читать можно. smile 

Ну и немного конкретики. Я тоже обратил внимание, что слушатель мой берет на себя всю нагрузку со всего приложения, что уже интуитивно мне не понравилось - расценил как слабое место видимо. Как же правильно переделать мой код, что бы избежать MVC? Делать для каждого класса свой контроллер (на каджый класс по слушателю)? Т.е. по сути вместо одного MVC на все приложение, создаем и инкапсулируем кучку мелких MVC'тиков? smile Действительно, MVC для простых приложений не принципиально... но лучше уж сразу учится правильному коду, чем потом переучиваться. Ведь и приложения будут расти пропорционально с ростом опыта.

По поводу пункта №1. Как истенно ленивый человек, любящий подумать, я все больше понимаю красату принципов ООП.

По счет пункта №2. Получается, для каждого поля мне нужно писать свои get и set методы? А если эти поля в классе исчисляются десятками? Спрашиваю со ссылкой на первый пункт. smile Хотя если серьезно, по этому поводу я немного читал. Второй пункт, если я не ошибаюсь, и есть инкапсуляция. Обращаясь к полям через методы мы обеспечиваем большую безопастность, стабильность с одной стороны, а с другой получаем больший контроль над кодом. Все верно?

И пункт №3. Комментарий "Потому что Stra теперь и есть Form" окончательно уложил и утрес мои знания о наследовании классов. До меня дошло, что наследовать можно ведь ни только свои, но и классы библиотеки Java. И то, что хоть класс и наследник, это ему ни как не мешает заниматься своими собственными делами, даже порой отличными от наследуемого класса. smile

Как ни крути, очень информативный для меня пост. Еще раз спасибо!

Это сообщение отредактировал(а) Kalisnik - 29.2.2012, 23:58
PM MAIL   Вверх
oxigen
Дата 1.3.2012, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 12.4.2010

Репутация: 4
Всего: 4



MVC по своей сути нарушение инкапсуляции.
Принцип инкапсуляции можно сформулировать так: Если что-то возможно сделать внутри класса, то это нужно делать внутри класса.
Нажатие на кнопку происходит внутри формы, значит и слушать и максимально обрабатывать его нужно внутри формы.

Если есть 3 статичных формы, то хранить их можно где-то отдельно. В классе мидлета, и запрашивать по необходимости. 

Код

class Stra extends Form  implements CommandListener {
 ChoiceGroup choice;

 public void commandAction(Command c, Displayable d) {
        if(c == ok){
            display.setCurrent(Midlet.getFormByIndex(choice.getSelectedIndex()));
  }
}

public class Midlet extends MIDlet {
    

private static Stra str, str2, str3; //пусть будут статиками. Не принципиально, просто простоты обращения к ним.

public static Stra getFormByIndex(int index) { //опять же статик просто чтоб можно было вызывать через Midlet.getFormByIndex

      if(index == 0) {
           if(str == null) {
             str = new Str("Form1"); // Ленивая инициализация. Форма создается только при первом обращении к ней. 
          }                                        //А если не обратятся - то и не надо ей память  занимать и время на создение напрасно тратить. 
        return str;
        }

        if(index == 1) {
            if(str2 == null) {
                str2 = new Str("Form2");
            }
            return str2;
        }

        if(index == 2) {
            if(str3 == null) {
                str3 = new Str("Form3");
            }
            return str3;
        }
}


С back вопрос неоднозначный на самом деле. Стек более гибкое решение, позволяет возвращаться сразу на N шагов назад и класть в него одну и ту же форму несколько раз. 

По счет пункта №2. Получается, для каждого поля мне нужно писать свои get и set методы? А если эти поля в классе исчисляются десятками? 

Поля вполне могут могут исчисляться десятками. Но геттеры и сеттеры нужны только для тех полей, которые нужны снаружи класса.
Часть полей - используются только внутри самого класса. геттеры и сеттеры не нужны
Часть полей устанавливается только один раз при создании объекта и их значения передаются в конструкторе.  геттеры и сеттеры не нужны.
А если снаружи нужно получать доступ к десяткам полей, то это обычно говорит или о плохо спроектированом классе (слишком большой) или о нарушении инкапсуляции (снаружи класса делаются операции, которые могли бы быть сделаны внутри класса).

Обращаясь к полям через методы мы обеспечиваем большую безопастность, стабильность с одной стороны, а с другой получаем больший контроль над кодом. Все верно? Так и есть. Сеттер может выполнять проверку значения на допустимость. Може писать в лог. Даже если сейчас это не нужно - то предсказать, понадобится ли это в дальнейшем невозможно.
Кроме того методы доступа позволяют изменять реализацию класса не меняя его интерфейс.
Допустим сейчас есть

Код

class A {
 private int field;

 public int getField() {
    return field;
 }

public void setField(int val) {
  this.field = val;
}

}


и вдруг понадобилось хранить этот field как Integer(автоупаковки в ME нет) или вовсе как String.
Достаточно добавить пару строк в методы доступа. А не искать по всему коду, где используется прямой доступ к полю.
Остальной код вообще не узнает о том, что тип field изменился.

Это сообщение отредактировал(а) oxigen - 1.3.2012, 18:38
PM MAIL   Вверх
Kalisnik
Дата 1.3.2012, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 21.6.2011

Репутация: нет
Всего: нет



А вот пример выше не совсем понятен. Если я не ошибаюсь, класс использующий какой-либо интерфейс должен в обязательном порядке реализовывать все методы используемого интерфейса. В примере выше интерфейс CommandListener реализует класс Midlet, но не реилизует метод commandAction. А в классе Stra все с точностью наоборот. Поскольку Stra не реализует интерфейс CommandListener, метод commandAction работать не должен(?). Разве что сделать наследование, либо того, либо другого класса.

З.Ы. Кстати, что-то не проверял, возможно ли множественное наследование в Java?

Это сообщение отредактировал(а) Kalisnik - 1.3.2012, 18:20
PM MAIL   Вверх
oxigen
Дата 1.3.2012, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 12.4.2010

Репутация: 4
Всего: 4



Сорь, невнимательно скопипастил.

Множественно наследовать можно только интерфейсы, но не реализацию.

Код

class A extends OnlyOneSuperclass implements Interface1, Interface2, Interface3, Interface4

PM MAIL   Вверх
Kalisnik
Дата 1.3.2012, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 21.6.2011

Репутация: нет
Всего: нет



Получается в каждом из обектов stra* будет свой отдельный слушатель? Эти слушатели слушают если форма не активна?

З.Ы. т.е. вопрос касательно затрат ресурсов.
З.З.Ы. Хотя с таким вопросом я наверно маху дал ))) Ок. Спасибо! На сем наверно пока все. Пойду открывать новую тему. smile

Это сообщение отредактировал(а) Kalisnik - 1.3.2012, 19:02
PM MAIL   Вверх
oxigen
Дата 2.3.2012, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 12.4.2010

Репутация: 4
Всего: 4



Угу. Слушатель ничего не слушает в фоне.
Это всего лишь метод, который будет вызван после нажатия на пункт меню.
И по затратам ресурсов абсолютно неважно, в каком классе этот метод находится.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.0864 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.