forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ (http://forum.boolean.name/forumdisplay.php?f=48)
-   -   Пишем либы для MidletPascal на JAVA (http://forum.boolean.name/showthread.php?t=440)

pax 18.12.2005 17:18

Прежде всего нам понадобятся:

1. JAVA SDK
2. JAVA WTK
3. jGRASP
4. ну и MidletPascal для тестирования либ.
Примечание: JAVA WTK должен быть установлен после JAVA SDK

Далее я опишу последовательность создания либы, описанной в справочной системе MidletPascal, но буду использовать для этого Java IDE jGRASP.

Начнем с настроек jGRASP.

1. В Меню Settings->Compiler Settings выбираем пункт File.

2. В закладке Environment выбираем j2me - WTK1 generic и жмем кнопку Use.

3. Создаем проект j2me (Project->New->New J2ME Project), указываем путь и название проекта, убираем галочку с пункта Import Files Now.

4. Добавляем файл Java в проект, он будет содержать модуль, который мы потом подключим к MidletPascal. Для этого в меню Project выбираем пункт Add Files, заходим в папку \src\ нашего проекта, пишем название файла Lib_mylib.java и жмем кнопку Add. Слева в окне Open Projects под названием нашего проекта появится пункт Lib_mylib.java src\ . Щелкните по нему два раза и нажмите кнопку Create, для создания этого файла.

5. Теперь самая интересная чать... кодинг :). В открывшееся окно вводим следующий код:

Код:

// Класс модуля НЕ ДОЛЖЕН содержаться в каком-либо архиве!!!

// Имя класса должно начинаться с префикса Lib_ и все символы *
// идущие после L должны иметь нижний регистр
public class Lib_mylib
{
 *// Все функции должны быть статическими, и все символы
 *// в функциях должны иметь нижний регистр
 *public static int square(int val)
 *{
 * *return val * val;
 *}

 *public static int count_numbers(String text)
 *{
 * *int count = 0;
 * *int i;
 * *for(i = 0; i < text.length(); i++)
 * *{
 * * *if ((text.charAt(i) >= '0') && (text.charAt(i) <= '9'))
 * * * *count ++;
 * *}
 * *return count;
 *}
}

6. Настало время компиляции. В меню Build последовательно выбираем пункты Compile и Preverify.

Вот и все. Нащ модуль готов.

Теперь настало время его протестировать.

Для начала скопируем наш модуть из папки \classes\ нашего проекта в папку \Program Files\MIDletPascal\Libs\. Далее в MIDletPascal создаем новый проект и вводим туда следующий код:

Код:

program NewProject;
uses MyLib;

var idx : integer;
begin
 *ShowForm;
 *
 *idx := FormAddString('5 squared is: ' + MyLib.square(5));
 *
 *idx := FormAddString('There are ' + *
 * * * * * * * * * * * MyLib.count_numbers('a0b2c') + *
 * * * * * * * * * * * ' numbers in ''a0b2c'' ');
 *Delay(5000);
end.

Жмем кнопку Build and run и наслаждаемся результатом :)

Guest 24.12.2005 10:13

Ага из хелпа пример работает. А больше 2к кода перестает видеть функции.

pax 24.12.2005 22:45

Цитата:

Originally posted by Guest@Dec 24 2005, 10:13 AM
Ага из хелпа пример работает. А больше 2к кода перестает видеть функции.
Ну можно разбить либу на несколько :) , если конечно одна функция не больше 2-х кб ;)

pilgrim 25.12.2005 12:35

Не не прикольно. Хочу разобраться где тут собака порылась. На java то все работает.
Ведь переношу функцию выше по исходному тексту и все начинает работать.

dzaniss 02.08.2006 02:08

Re: Пишем либы для MidletPascal на JAVA
 
Я столкнулся с проблемой,как вытянуть имена записей RMS!?Вот и написал сам на яве и добавил к Lib_rsenum!Точку применил для скрытых записей,например имя .CONFIG не добавится в строку!

public static String list(int idx) {
StringBuffer s = new StringBuffer();
try{

String as[] = RecordStore.listRecordStores();
if(as != null)
{
for(int l = 0; l < as.length; l++)
if(as[l].charAt(0) != '.')
s.append(as[l]).append('|');

}

}catch(Exception e) {return "";}
return s.toString();
}


Только вот вопрос,не выходит таким образом s:= list(); Поэтому так и зделал,любую цифру вставлять s:= list(1); И спасибо piligrimu за его работу,я на ура применил его библиотеку для файлменеджера,но с байтами там нето что-то!

EQ 31.01.2007 15:08

Re: Пишем либы для MidletPascal на JAVA
 
Ё-моё, у вас всё хорошо идёт, а у меня не компилится ни так, как в хелпе написано, ни так, как здесь сказано. У меня WTK25, как мне быть? Если так нужен WTK1, то где его взять? На сайте видел только 2.2...

Fire_Phoenix 17.12.2007 16:12

Re: Пишем либы для MidletPascal на JAVA
 
Я заметил, что после компиляции приложения, в jar архиве появляется FW.class, что это такое и откуда берется? Если заглянуть в справку, то там этот же файл использовался для написания своей библиотечки....

ViNT 17.12.2007 18:36

Re: Пишем либы для MidletPascal на JAVA
 
Это главный класс приложения, он генерируется самим MP.
В основном взаимодействие библиотек с приложением происходит именно через классы FW и M.

Fire_Phoenix 17.12.2007 21:34

Re: Пишем либы для MidletPascal на JAVA
 
То есть при написании библиотек нужно/можно ссылаться на эти классы?

ViNT 17.12.2007 23:04

Re: Пишем либы для MidletPascal на JAVA
 
Да, если например нужно работать с дисплеем, то это можно делать только через эти классы. То же самое относится и к плееру(класс P, переменная p).

odd 18.12.2007 08:31

Re: Пишем либы для MidletPascal на JAVA
 
А как компилить либы с использованием MP классов? Скажем, я хочу обратитьься к M.G. компилятор ругается на отсутствие этих классов, может надо прилагать M.java к файлу библиотеки? Опишите plz такую компиляцию, а то я чисто java классы могу использовать, а к классам MP нет доступа.

Piligrim 18.12.2007 13:30

Re: Пишем либы для MidletPascal на JAVA
 
при компиляции просто кладешь в папку со своей библиотекой FW.java и он компилируется вместе с ней, ну а потом его просто игнорируешь.
можно еще другим способом: указать в classpath папку с FW.class

Phantom 07.07.2008 06:53

Ответ: Пишем либы для MidletPascal на JAVA
 
Здравствуйте, я джаву не знаю толком, только в общих чертах. Не могли бы вы написать пример либы, как вывести текст на канвас. Я понимаю, что в мидлет паскале это просто через drawText() делается =) Но мне просто посмотреть охота, как в либе это реализовать, понять нужно. Ну вот, например, нужно сделать либу с одной функцией, которая будет работать аналогично drawText(), но называться, скажем, printText(). Напишите, если не сложно, а то я уже как только не пробовал.

odd 07.07.2008 08:23

Ответ: Пишем либы для MidletPascal на JAVA
 
Цитата:

Сообщение от Phantom_wc (Сообщение 81837)
Здравствуйте, я джаву не знаю толком, только в общих чертах. Не могли бы вы написать пример либы, как вывести текст на канвас. Я понимаю, что в мидлет паскале это просто через drawText() делается =) Но мне просто посмотреть охота, как в либе это реализовать, понять нужно. Ну вот, например, нужно сделать либу с одной функцией, которая будет работать аналогично drawText(), но называться, скажем, printText(). Напишите, если не сложно, а то я уже как только не пробовал.

Ну типа так:

Код:

import javax.microedition.lcdui.Graphics;

class Lib_test
{
    public static void printtext(String s, int x, int y)
    {
        M.G.drawString(s, x, y, 20);
    }
}


Phantom 07.07.2008 14:37

Ответ: Пишем либы для MidletPascal на JAVA
 
Спасибо =) Как я понимаю, нужно при компиляции M.class в папку положить, чтобы компилятор не ругался, да? Вот только, как вы понимаете, где писать M.G, а где, например, FW.fw?.. Я не знаю, как это называется, у меня с терминологией проблемы =) Грубо говоря, где вы вычитали через какие классы к каким кускам Джавы обращаться нужно? Я к Graphics только не пробовал, но всё ошибка была =) По такому-то ведь в джаве можно так, если не ошибаюсь:
javax.microedition.lcdui.Graphics.drawString(s, x, y, 20);
Почему же в мидлет паскале нельзя так? Почему всё так запутано?
- - -
Сорри за такой тупой пост, просто я до этого толком только на php писал, а на нём даже обезьяну можно научить кодить :D

ViNT 07.07.2008 14:49

Ответ: Пишем либы для MidletPascal на JAVA
 
Цитата:

Сообщение от Phantom_wc (Сообщение 81849)
Спасибо =) Как я понимаю, нужно при компиляции M.class в папку положить, чтобы компилятор не ругался, да?

Да.
Цитата:

Сообщение от Phantom_wc (Сообщение 81849)
Вот только, как вы понимаете, где писать M.G, а где, например, FW.fw?.. Я не знаю, как это называется, у меня с терминологией проблемы =) Грубо говоря, где вы вычитали через какие классы к каким кускам Джавы обращаться нужно?

Для этого нужно знать java, читать доки по ней.
Цитата:

Сообщение от Phantom_wc (Сообщение 81849)
Я к Graphics только не пробовал, но всё ошибка была =) По такому-то ведь в джаве можно так, если не ошибаюсь:
javax.microedition.lcdui.Graphics.drawString(s, x, y, 20);
Почему же в мидлет паскале нельзя так? Почему всё так запутано?

javax.microedition.lcdui.Graphics.drawString(s, x, y, 20); это только метод класса. А вызывать его нужно не для типа(что происходит в данном случае), а для переменной,экземпляра данного класса, т.е. M.G это экземпляр класса javax.microedition.lcdui.Graphics, и писать нужно именно M.G.DrawString.

Phantom 07.07.2008 15:51

Ответ: Пишем либы для MidletPascal на JAVA
 
Позвольте, джаву-то, разумеется, нужно знать, но тут ещё нужно и мидлет паскалевские классы знать. Напишем так в джаве:
M.G.DrawString
И ничего не выйдет. Я пытался джава класс переделать в мидлет паскалевскую либу, так ничего не получалось. Ну сейчас я уже в общем-то побольше понял, думаю, что справлюсь =)
Цитата:

javax.microedition.lcdui.Graphics.drawString(s, x, y, 20); это только метод класса. А вызывать его нужно не для типа(что происходит в данном случае), а для переменной,экземпляра данного класса, т.е. M.G это экземпляр класса javax.microedition.lcdui.Graphics, и писать нужно именно M.G.DrawString.
Что значит, происходит вызывание для типа? Для типа чего? Какого типа? У меня вообще с терминами проблемы. Пытался книжки по Джаве читать, но мало чего понял...
- - -
Я помню, про наследование читал, если не ошибаюсь, экземпляр класса наследует все его свойства, так какая разница как писать? О_о Или я чего-то недогоняю?
- - -
Вот что каждая часть этой строки обозначает:
M.G.drawString(s, x, y, 20);
???
M - это МидлетПаскалевский класс. Это понятно.
G - это переменная-экземпляр javax.microedition.lcdui.Graphics? А где это описано? В том же классе M переменной G присваивается экземпляр ...Graphics?
А drawString - это как правильно назвать? Функция? Процедура?
- - -
Я немного отрывочно в теории немного это всё знаю. Ну, например, знаю, что javax.microedition.lcdui - это типа один из пакетов Джавы, в каждом из пакетов хранятся какие-то определённые возможности. Например, если нужно нам работать с графикой, нужно через импорт этот пакет в файл класса подключить. Можно написать так:
javax.microedition.lcdui.*
Тогда в файл как бы подключатся все (вот опять забыл как правильно назвать, то ли функции, то ли методы, то ли классы) этого пакета.

ViNT 07.07.2008 16:29

Ответ: Пишем либы для MidletPascal на JAVA
 
Естественно, знать классы MP нужно, но их описания нигде нет, поэтому приходится изучать самому, опираясь на знание java.
Цитата:

M - это МидлетПаскалевский класс. Это понятно.
G - это переменная-экземпляр javax.microedition.lcdui.Graphics? А где это описано? В том же классе M переменной G присваивается экземпляр ...Graphics?
G это переменная типа javax.microedition.lcdui.Graphics (по паскалевской терминалогии), или экземпляр класса javax.microedition.lcdui.Graphics(по терминалогии java). javax.microedition.lcdui.Graphics это всего лишь описание класса, а вот G - реальный объект в памяти, над которым можно производить действия. Точно так же, как в паскале Integer это только тип данных, а I:Integer это реальная переменная.
Цитата:

А drawString - это как правильно назвать? Функция? Процедура?
Ну если говорить точно, то это метод класса. Вообще можно сказать процедура.

p.s. Терминология не главное, я сам в ней иногда немного путаюсь, главное - понимать, как это работает.

Phantom 07.07.2008 17:21

Ответ: Пишем либы для MidletPascal на JAVA
 
Уже начинаю въезжать. Но терминалогию я плохо знаю, поэтому сложно даже вопросы задавать, так как не знаю как вещи правильно назвать. =) Что ж... Если смогу написать либу, то буду считать, что первый шаг сделан =)

Phantom 08.07.2008 05:25

Ответ: Пишем либы для MidletPascal на JAVA
 
Код:

import javax.microedition.lcdui.Graphics;

public class Lib_test {
// ***********************************
 public static void printtext(String s,int x,int y){
    M.G.setColor(50,200,255);
    M.G.drawString(s,x,y-1,M.G.LEFT|M.G.TOP);
    M.G.drawString(s,x,y+1,M.G.LEFT|M.G.TOP);
    M.G.drawString(s,x-1,y,M.G.LEFT|M.G.TOP);
    M.G.drawString(s,x+1,y,M.G.LEFT|M.G.TOP);
    M.G.setColor(0,0,200);
    M.G.drawString(s,x,y,M.G.LEFT|M.G.TOP);
 }
// ***********************************
}

Ура! Работает! Выводит строку s на канвас по координатам x и y =) Текст выводится синий с голубой обводкой =)
Теперь есть такие вопросы:
1) Почему-то не получается вызвать репэинт из либы. Это возможно?
2) Как в либе обращаться к функции изменения шрифта? M.G.setFont() не работает.
3) Как в либе получить ширину экрана, вычесть из неё длину строки в пикселах и разделить на два? =) Ну типа чтобы вместо координаты x текст всегда по центру позиционировался. M.G.getClipWidth() и M.G.stringWidth(s) вроде не работают. =(
- - -
Я понимаю, что всё это легко делается на самом мидлет паскале, но мне нужно понять, как в либе это сделать, чтобы научиться писать что-то более сложное. Сильно не пинайте.
= = =
Добавлено позже:
Пардон, разобрался с половиной вопросов =)
Код:

import javax.microedition.lcdui.*;

public class Lib_test {
// ***********************************
 public static void printtext(String s,int y){
    M.G.setFont(M.G.getFont());
    int x = (M.G.getClipWidth()-M.G.getFont().stringWidth(s))/2;
    M.G.setColor(50,200,255);
    M.G.drawString(s,x,y-1,M.G.LEFT|M.G.TOP);
    M.G.drawString(s,x,y+1,M.G.LEFT|M.G.TOP);
    M.G.drawString(s,x-1,y,M.G.LEFT|M.G.TOP);
    M.G.drawString(s,x+1,y,M.G.LEFT|M.G.TOP);
    M.G.setColor(0,0,200);
    M.G.drawString(s,x,y,M.G.LEFT|M.G.TOP);
 }
// ***********************************
}

Такая конструкция работает. Но я не понял, как getFont() передавать параметры отображения шрифта. Например, я хочу маленький жирный шрифт сделать:
M.G.setFont(M.G.getFont(M.G.getFont().FACE_SYSTEM, M.G.getFont().STYLE_BOLD,M.G.getFont().SIZE_SMALL) );
Код:

Lib_test.java:6: getFont() in javax.microedition.lcdui.Graphics cannot be applied to (int,int,int)
    M.G.setFont(M.G.getFont(M.G.getFont().FACE_SYSTEM,M.G.getFont().STYLE_BOLD,M.G.getFont().SIZE_SMALL));
                  ^
1 error

Да и выглядит это слишком нагружено, можно как-нибудь сократить запись от повторений? А то только "M.G.getFont()" в одной строке сколько раз повторяется...
= = =
Добавлено ещё позже:
Блин, а что делать, если мне нужно глобальную переменную использовать? Ну я не знаю, как это в Джаве называется. То есть мне нужно в либе сделать несколько функций/процедур, которые будут использовать одни и те же переменные. Можно, конечно, сделать, чтобы функции возвращали значения, которые потом использовались бы в других функциях путём явной передачи их туда. Но дело в том, что там функция возвращает не одну переменную, а несколько. Может можно сделать что-то типа массива или... я даже не знаю. Чтобы в одной переменной сразу кучу передавать.
- - -
У меня класс есть, я его хотел подключить к мидлет паскалю хитрым способом. Типа написать либу, которая будет к тому классу обращаться по-мидлетпаскалевски, все процедуры объявил статичными, а при компиляции мне выдало, что те функции, к которым я пытаюсь обратиться из либы не являются статичными. То есть что, получается, я не могу из статичной функции одного класса обратиться к нестатичной функции другого класса? О_о Как выходить из такой ситуации?
- - -
В мидлет паскале можно создавать комбинированный тип данных. Полагаю, что это может пригодится, но как его связать с джавой?
- - -
P.S: подозреваю, что я опять всё напутал и вместо слова "функция" следовало употреблять слово "метод" =)

odd 08.07.2008 08:33

Ответ: Пишем либы для MidletPascal на JAVA
 
Цитата:

Сообщение от Phantom_wc (Сообщение 81893)
Блин, а что делать, если мне нужно глобальную переменную использовать? Ну я не знаю, как это в Джаве называется. То есть мне нужно в либе сделать несколько функций/процедур, которые будут использовать одни и те же переменные. Можно, конечно, сделать, чтобы функции возвращали значения, которые потом использовались бы в других функциях путём явной передачи их туда. Но дело в том, что там функция возвращает не одну переменную, а несколько. Может можно сделать что-то типа массива или... я даже не знаю. Чтобы в одной переменной сразу кучу передавать.
- - -
У меня класс есть, я его хотел подключить к мидлет паскалю хитрым способом. Типа написать либу, которая будет к тому классу обращаться по-мидлетпаскалевски, все процедуры объявил статичными, а при компиляции мне выдало, что те функции, к которым я пытаюсь обратиться из либы не являются статичными. То есть что, получается, я не могу из статичной функции одного класса обратиться к нестатичной функции другого класса? О_о Как выходить из такой ситуации?
- - -
В мидлет паскале можно создавать комбинированный тип данных. Полагаю, что это может пригодится, но как его связать с джавой?
- - -
P.S: подозреваю, что я опять всё напутал и вместо слова "функция" следовало употреблять слово "метод" =)

Глобальные переменные нужно делать статичные, но и процедуры при этом должны быть тоже статичные. Типа так:

Код:

class Lib_test
{
    public static int a;
    public static int b;
    public static String s;  // Глобальные переменные

    public static void Function1()          // Пример функции
    {
        a = 1; b = 3; s = "Ok";
    }

    public static int Function2()          // Другой пример функции
    {
        a += b;
        return a;
    }
}

Другой пример. Как из статической функции одного класса вызывать нестатическую функцию из другого класса. Допустим у тебя есть класс:

Код:

class MyClass
{
    public int a;
    public int b;  // какие-то переменные

    public void Function1()
    {
        a = 5;
    }

    public int Function2()
    {
        return a;
    }
}

Ясно, что из MP ты к этим функциям не обратишься т.к. они не статичные. Тогда пишем небольшую библиотеку со статичными функциями, которая и будет вызывать наши нестатичные функции.

Код:

class Lib_test
{
    public static MyClass my;

    public static void Function1()
    {
        my.Function1();
    }

    public static int Function2()
    {
        return my.Function2();
    }
}


Phantom 08.07.2008 10:18

Ответ: Пишем либы для MidletPascal на JAVA
 
Опа! Спасибо! Я почти так и делал, только эту строку не добавлял:
public static MyClass my;
Теперь всё откомпилировалось. И в мидлет паскале без ошибок откомпилировалось. Но программа не идёт. Запускаю на эмуляторе и он тут же закрывается. =(
В классе используются пакеты
import java.util.Vector;
import javax.microedition.lcdui.*;
Это имеет значение? В чём может быть дело?
- - -
Запустил на телефоне (Сименс С75). Прога запустилась. Просто белый экран. На функции из либы/класса повисло, иначе бы через 10 секунд прога сама закрылась бы, так как delay(10000); стоит.

Piligrim 08.07.2008 11:05

Ответ: Пишем либы для MidletPascal на JAVA
 
M.G.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_ITALIC, Font.SIZE_SMALL);

не забываем
import javax.microedition.lcdui.Font;

PS: а где Вы простите создаете экземпляр класса my?

Phantom 08.07.2008 11:40

Ответ: Пишем либы для MidletPascal на JAVA
 
1) На Font.getFont, а именно на Font ругается компилятор во всех местах, где я его пытаюсь использовать.
2) Что такое экземпляр? Я писал так, как в примере odd'а. Компиляция успешно прошла.
- - -
Это я хочу прикрутить класс для мультистрочного вывода текста к мидлет паскалевской программе =) А ещё лучше полностью его в либу переписать. Хочу понять, как вообще писать либы.
- - -
Добавил позднее:
Мда. Переписал весь класс в либу. Он откомпилировался. Положил его в мидлет паскаль. Написал прогу на мидлет паскале, нажимаю Буилд, он мне выдаёт, что одной из функций в либе нет. После 10 минут предпринимания всяких нелогичных действий я решил в либе поменять местами функции. То есть в принципе ничего не изменилось. Откомпилировал заново и, О ЧУДО, мидлет паскаль стал видеть все функции! Откомпилировалась прога, запускаю и... Опять просто белый экран =( Но теперь уже идёт на эмуляторе и закрыввается через 10 секунд =) Значит процедуры из либы не повисают, а выполняются =) Но должен текст выводиться на экран, блин!
P.S: Процедура, которую паскаль не хотел видеть, находилась в самом конце файла (либы имеется в виду). Возможно он не может длинные либы воспринимать как надо =( Тут уже кто-то писал, что в больших либах перестаёт видеть функции...

Phantom 08.07.2008 21:41

Ответ: Пишем либы для MidletPascal на JAVA
 
Мдаааа... Откомпилировал этот класс, сделал всё на Джаве, вообще без мидлет паскаля... В эмуляторе идёт, отображается текст, работает прокрутка... А на моём сименсе при запуске ввыдаёт:
MIDlet initialization failed:
java.lang.Error: 56

Может это потому что текст в ANSI? Пробовал компилировать в UTF-8 - на эмуляторе просто белый экран, на телефоне не тестил.
Что-то с этим классом не то...

Piligrim 08.07.2008 22:54

Ответ: Пишем либы для MidletPascal на JAVA
 
Код:

import javax.microedition.lcdui.Font;

public class Lib_cnv3 {
public static void test() {
        M.G.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_ITALIC, Font.SIZE_SMALL));
}
}

компилируется без ошибок, не забывайте о мелочах пожалуйста.

odd 09.07.2008 07:58

Ответ: Пишем либы для MidletPascal на JAVA
 
Поделись исходниками, будем вместе думать почему там у тебя происходят ошибки и зависания. Попробуй в либу Lib_test добавить конструктор типа:

Код:

Lib_test
{
    my = new Mylib();
}

А пока можешь потестить и сам. Не забывай, что в Java есть механизм обработки исключений. По-этому все потенциально опасные действия лучше делать, используя конструкцию try/catch:

Код:

try
{
    с = a / b;  // Опасное действие. А вдруг b равно 0 ?
}
catch (Exception e)
{
}


Phantom 09.07.2008 10:40

Ответ: Пишем либы для MidletPascal на JAVA
 
Цитата:

компилируется без ошибок, не забывайте о мелочах пожалуйста.
Так я же писал
import javax.microedition.lcdui.*;
Это ведь означает, что теперь в классе можно использовать всё из пакета import javax.microedition, в том числе и Font. Разве не так? О_о
Цитата:

Поделись исходниками, будем вместе думать почему там у тебя происходят ошибки и зависания.
http://www.mobilab.ru/articles/96/ - это статья про этот класс. Там же его и взять можно.
http://wapcode.ru/mls.zip - это мои наработки. Это я пытался либу использовать как промежуточный класс для связи класса с мидлет паскалем.
- - -
Наверно, надо перебираться на чистую джаву...
- - -
А это что значит:
catch (Exception e) ?
Ошибку на экран выдаст? И программа дальше будет выполняться? Или try/catch - это типа die() в php?

Piligrim 09.07.2008 11:42

Ответ: Пишем либы для MidletPascal на JAVA
 
http://forum.boolean.name/showthread.php?t=6093
ЗЫ: если так получается здесь почему есть уверенность, что получится на чистой яве?

Phantom 09.07.2008 13:16

Ответ: Пишем либы для MidletPascal на JAVA
 
Цитата:

ЗЫ: если так получается здесь почему есть уверенность, что получится на чистой яве?
Да я не в том смысле. Я в смысле, что половину писать на джаве, половину на паскале... Зачем? Лучше уж сразу на джаве. =)
- - -
Вопрос не в тему: Почему когда я в свойствах проекта ставлю MIDP 2.0, то приложения получаются неполноэкранные? А когда MIDP 1.0, то всё нормально. Телефон Сименс С75. Сверху и снизу остаются полоски с картинкой, которая в теме телефона установлена. То есть площадь канваса становится примерно 132x148 вместо 132x176 О_о
- - -
Добавлено гораздо позже:
Разобрался, поставил другую версию паскаля с сайта ODD'а.
- - -
У меня не получается сделать класс и либу. Вот я хочу, например, сделать класс, чтобы он весь экран заливал тёмносерым цветом.
Файл gr.java:
PHP код:

import javax.microedition.lcdui.Graphics;

public class 
gr{
// ***********************************
 
public static Graphics g;
 public static 
int x,y;
 public static 
int w=g.getClipWidth();
 public static 
int h=g.getClipHeight();
// ***********************************
 
public static void background(){
   
g.setColor(44,44,44);
   
g.fillRect(0,0,w-1,h-1);
 }
// ***********************************


Файл Lib_fc.java:
PHP код:

import javax.microedition.lcdui.*;

public class 
Lib_fc{
// ***********************************
 
public static void init(){
   
gr=new gr();
 }
// ***********************************
 
public static void background(){
   
gr.background();
 }
// ***********************************
 
private static gr gr;
// ***********************************


Пишу в мидлет паскале:
PHP код:

program canvas;
 
uses fc;
begin
 fc
.init;
 
fc.background;
 
repaint;
 
delay(10000);
end

В чём ошибка? Что я делаю не так? Всё это, что я выше написал, нормально компилируется, но при запуске проги хоть на эмуляторе, хоть на телефоне просто белый экран, как и всегда по умолчанию...

odd 09.07.2008 22:31

Ответ: Пишем либы для MidletPascal на JAVA
 
А файл gr.class в проект добавлял? Вообще библиотеки к MP лучше писать одним файлом, а не разбивать на кучу файлов.

Phantom 09.07.2008 22:43

Ответ: Пишем либы для MidletPascal на JAVA
 
Всё добавлял. Не работает =( Так я просто тренируюсь, изучаю. Хотел написать класс, а добавить его к мидлет паскалю при помощи либы. Вот =( Не выходит...
- - -
Блин. У меня по ходу что-то с компилятором не в порядке... Пытаюсь откомпилировать либу пилигрима, мне ошибку пишет:
Код:

Lib_text.java:9: cannot find symbol
symbol  : variable G
location: class M
          MLT.SetTextPar(x, y, w, h, dy, fsz, fst, ft, M.G, s);
1 error

Указатель показывает на точку между M.G

Piligrim 09.07.2008 23:22

Ответ: Пишем либы для MidletPascal на JAVA
 
Я если честно не уловил где g, который Graphics в классе gr получает значение M.G? Если этого нет, то простите, на чем мы рисуем?

Phantom 10.07.2008 00:55

Ответ: Пишем либы для MidletPascal на JAVA
 
Ыыы... Пардон... Ща попробую исправить. Но, кстати, когда пытаюсь откомпилить твою либу, как раз компилятор ругается на M.G, которое ты передаёшь классу. Я уж не знаю почему. Класс M.class лежит где надо, его компилятор видит.
- - -
Добавил спустя пару минут:
Мда... Теперь компилятор и на мою либу ругается с точно такой же ошибкой. Указатель показывает на точку между M и G. То есть, как я понимаю, класс M.class видит, но пишет, что переменной G нет или что-то типа того =( Раньше пробовал подобное делать, вроде получалось... Что-то тут нездоровое...
- - -
Ещё спустя минут 7:
Блин. Я вообще ничего не понимаю. Заменил M.class на другой, из другого проекта - всё нормально откомпилировало! Видимо, у меня ещё и класс этот какой-то не сосем нормальный был... Но ведь в принципе от приложения не зависит. От любого ведь должен подойти, мидлетпаскалевского, разумеется.
- - -
Спустя почти два часа:
А можно как-нибудь из либы передать M.G сразу в класс, а не в определённую функцию? Можно, конечно, сразу в классе прописать
private Graphics g=M.G;
тогда работает. Но если поставить себе такое условие, что нельзя так делать. А в классе две функции. Одна из них будет через либу использоваться в паскале, а вторая многократно вызывается первой. Обоим им нужен M.G. Пока сделал, чтобы из первой во вторую передавалась переменная g в качестве параметра. То есть, первая из либы получает M.G, юзает там его, потом вызывается много раз вторая функция и каждый раз передаётся в неё полученный M.G... Во как.
- - -
Спустя ещё два часа:
Всё. Пора убить телефон ап стену и выкинуть комп в окно. Ничего у меня не получается. На эмуляторе идёт, на сименсе белый экран и висит. У брата на смарте тоже белый экран и висит. Переписал всё просто в либу, без класса. Ситуация не изменилась. Добавил в каждую функцию try/catch, всё равно на эмуляторе идёт, а на телефонах нет. В чём может быть дело? Памяти, вроде, тут не использует много. Всё только примитивная работа с графикой...

odd 10.07.2008 08:18

Ответ: Пишем либы для MidletPascal на JAVA
 
А что за компилятор, если не секрет? Какая среда разработки?

Phantom 10.07.2008 14:12

Ответ: Пишем либы для MidletPascal на JAVA
 
SUNовский компилятор. Через командную строку. javac.exe и preverify1.1.exe...

ViNT 10.07.2008 14:42

Ответ: Пишем либы для MidletPascal на JAVA
 
Не советую компилять либы напрямую через javac(нсли это WTK) - у меня только 2 из 10 нормально компилятся, на остальных мобила зависает - моторовский отладчик в MIDWay пишет ошибку верификации класса. Юзайте JB и будет вам счастье =).

Piligrim 10.07.2008 15:08

Ответ: Пишем либы для MidletPascal на JAVA
 
Можно и напрямую javac, просто не забывайте добавлять -source 1.3 -target 1.3, чтобы соответсвовало CLDC 1.1

Phantom 10.07.2008 15:19

Ответ: Пишем либы для MidletPascal на JAVA
 
Пилигрим, так ведь прога-то получается в CLDC 1.0. По крайней мере так в манифесте прописано. Но попробую добавить эти ключи. А JB я как-то, вроде, качал, точно не помню. Ещё когда в первый раз хотел заняться Джавой. Что-то он мне не понравился, может путаю, или это я про MS VS... О_о То, что VS мне не понравился - это точно, один дебагер только ваще задрал. В основном брата =) У него постоянно из игр выкидывало с какими-то ошибками =) А вообще, мне среду разработки не надо, компилятора хватает. Так понять суть работы проще. А ещё подумываю написать он лайн компилятор, чисто так, ради интереса. Буду с локала запускать. Кто тестером будет? =)
- - -
Чуть позже:
Пилигрим, ты гений! Добавил ключи и всё работает!!!
- - -
Позднее:
А у брата на смарте так и белый экран :'(

Piligrim 10.07.2008 17:31

Ответ: Пишем либы для MidletPascal на JAVA
 
для CLDC 1.0 по-моему вообще надо -target 1.1.
Да, вот точно:
Цитата:

По реализации пересекающихся с J2SE классов, версии байт-кода CLDC 1.0 соответствует JDK 1.1, CLDC 1.1 –- JDK 1.3.

Phantom 10.07.2008 19:17

Ответ: Пишем либы для MidletPascal на JAVA
 
Написал -source 1.1 -target 1.1 вместо -source 1.3 -target 1.3.
Компилятор ругался на -source 1.1.
Написал -source 1.3 -target 1.1 - всё заработало!!! И на сименсе, и на смарте, и на эмуле!!! Родили, блин :D :D :D Вот оно - счастье! =)
- - -
P.S: Ничего, что эта тема больше походит на мой блог?

Phantom 11.07.2008 06:57

Ответ: Пишем либы для MidletPascal на JAVA
 
Блин, Джава вообще со строками работать умеет??? Я полночи инфу в гугле ищу, ещё смотрю книжки Пирумяна и Горнакова. Ничего не могу толком найти. Или я чего-то не понимаю. Как мне, например, получить субстроку от строки, начиная с определённого по счёту символа? Как узнать длину строки? Как поиндексно обращаться к строке? Ну например:
Код:

String s = "Привет";
String str1 = s[0]; // str = "П";
String str2 = s[3]; // str = "в";

Ну хоть что-то, блин, посоветуйте, ведь в мидлет паскале есть функции для работы со строками! Пробовал декомпилировать мидлетпаскалевский S.class - ничего не понял =(
- - -
Позже:
Создал по аналогии с декомпилированным мидлетпаскалевским классом вот такую функцию:
Код:

public static int myfunc(String s,int i){
return s.charAt(i);
 }

Методом тыка довольно быстро понял, что функция возвращает ASCII код символа с номером i строки s. Причём, если указать несуществующий индекс, то есть больше, чем длина строки, то мидлет повисает =) Уже что-то... На основе этого кучу самодельных функций для обработки строк можно сделать =) Но вот нужно ли? Должны быть в джаве ещё какие-нибудь функции!
- - -
Я так понимаю, в моём примере выше s - можно назвать объектом типа String, а всё, что после приписывается через точку - это типа методы что ли? Это я просто так спрашиваю, так как с формулировками ещё не особо разобрался...

odd 11.07.2008 08:13

Ответ: Пишем либы для MidletPascal на JAVA
 
Ну ты даешь. Это же азы.

String s = "Привет";

Длину строки теперь можно узнать так:

int len = s.length();

Вырезать одну букву:

char ch = s.charAt(0);

Отрезать кусок текста:

String s2 = s.substring(2, 5); // Результат: "иве"

PS: Юзай NetBeans 6.1 и будет тебе щастье. Советую также заглядывать в документацию по MIDP2.0 из пакета WTK.

Phantom 11.07.2008 08:21

Ответ: Пишем либы для MidletPascal на JAVA
 
Спасибо огромное! Я заглядывал в документацию MIDP2.0 из пакета WTK, только дальше главной страницы не пошёл, что-то мне всё показалось там не в тему =)
- - -
Слушайте, а вот если я использую indexOf(">") и в строке находит этот символ, то возвращается его индекс в строке, а если нет - мидлет повисает на этом месте =( А можно как-нибудь сделать так, чтобы в таком случае возвращался индекс последнего символа ну или символ конца строки типа?.. Пробовал засунуть эту функцию в условие if и приравнять внутри условия к нулю:

if((i=s.indexOf(">"))==0) i=s.length()-1;

То есть по моей логике если символ будет найден в строке, то возвратится TRUE и условие будет ложным, а если символ не найден, то возвратится FALSE, который при сравнивании с нулём выдаст TRUE и i будет равно последнему символу =) В php я подобным способом пользуюсь часто, думал и сдесь прокатит... Так ведь нет... Мидлет повисает при запуске... Почему? Может вставить try? А он не тормозит в общем? Просто я после php помешан на оптимизации =) А в скобочках у catch() что писать? Смотрел исходники разные, там по-разному пишут. В общем, что в таких ситуациях обычно делают при кодинге на Джаве?
- - -
P.S: А компилятор у меня теперь почти никогда не ругается, то ли совет Пилигрима помог, то ли я меньше ошибок делать стал =)
= = =
Блиин. Так тоже повисает:

try{
i=s.indexOf(">");
}catch(Exception exception){
i=s.length()-1;
}
= = =
Ещё такой вопрос. Если у меня есть строка "32fd45" - цвет rrggbb, то как мне эту строку самым простым способом заюзать в setColor?

Phantom 12.07.2008 10:18

Ответ: Пишем либы для MidletPascal на JAVA
 
То есть нужно как-то строку вида "rrggbb" превратить в 0xrrggbb (это как называется? Константа? Ну типа три байта). Можно, конечно, написать функцию, которая пропарсит строку и сделает три числа 0-255 для передачи их в функцию setColor(), но мне кажется можно как-то проще это сделать.

Piligrim 12.07.2008 15:48

Ответ: Пишем либы для MidletPascal на JAVA
 
1. String.indexOf(..) - возвращает -1 если не нашел вхождение.
2. setColor(Integer.parseInt("32fd45", 16));

Phantom 12.07.2008 16:37

Ответ: Пишем либы для MidletPascal на JAVA
 
Вот ё-моё, я ведь видел в исходниках Integer.parseInt(), но что-то тему не сумел развить =)
- - -
Скоро эту тему можно будет переделать в учебник по Джаве для начинающих =)

odd 13.07.2008 03:37

Ответ: Пишем либы для MidletPascal на JAVA
 
Цитата:

Сообщение от pilgrim (Сообщение 82163)
1. String.indexOf(..) - возвращает -1 если не нашел вхождение.
2. setColor(Integer.parseInt("32fd45", 16));

Кстати, при работе над Lib_alpha я обнаружил что парсинг как-то неправильно работает.
Например Integer.parseInt("aabbcc", 16); // Пашет
а Integer.parseInt("ffaabbcc", 16); // Зависает :-(
Т.е. при работе со всеми четырьмя байтами парсинг не поможет.:crazy:

Phantom 13.07.2008 10:06

Ответ: Пишем либы для MidletPascal на JAVA
 
А ты результат работы функции напрямую использовал в setColor? А в сет колор если 4 байта передать, то первый будет на альфаканал указывать? Ну мне пока с альфой не надо работать. Мне три байта надо - всё работает =)

Phantom 13.07.2008 20:49

Ответ: Пишем либы для MidletPascal на JAVA
 
Предположим у меня есть глобальная переменная x и есть локальная внутри функции, тоже x. Как мне внутри функции присвоить значение локальной переменной - глобальной?
this.x=x; не работает.
Компилятор пишет, что типа нельзя так в статичных функциях делать или что-то типа этого =(
Пока выкрутился. Просто переменные по-разному назвал. Глобальную - x, а локальную - xx.
В итоге так работает как надо:
x=xx;

ViNT 13.07.2008 20:56

Ответ: Пишем либы для MidletPascal на JAVA
 
Тогда можно писать Lib_mylib.x=x.

Piligrim 14.07.2008 00:13

Ответ: Пишем либы для MidletPascal на JAVA
 
здесь дело не в одинаковости имен. Компилятор же четко пишет, что нельзя обратиться к полю класса из статической функции. это можно сделать только если какой-то статической переменной присвоен сам класс.
т.е
public static MyClass inst;
....
inst = this; из метода класса
....
а потом можно обращаться к полям через inst.x из любой статической функции.

odd 14.07.2008 08:28

Ответ: Пишем либы для MidletPascal на JAVA
 
Кстати, если хочешь получить размер дисплея, надо писать не
PHP код:

g.getClipWidth;
g.getClipHeight// g - Экземпляр класса Graphics 

а
PHP код:

FW.CD.getWidth;
FW.CD.getHeight// CD - это вроде Current Display по-нашему текущий дисплей. 


Phantom 14.07.2008 09:56

Ответ: Пишем либы для MidletPascal на JAVA
 
Мда. Проще оставить с разными названиями переменных. О_о
- - -
PHP код:

FW.CD.getWidth
FW.CD.getHeight// CD - это вроде Current Display по-нашему текущий дисплей. 

А на джаве, без паскаля как это делать?

ViNT 14.07.2008 12:39

Ответ: Пишем либы для MidletPascal на JAVA
 
Так это и есть на java.
Кстати, я размер получаю по-другому, но тоже работает:
PHP код:

public clsss TForm extends Canvas{
********
}

----------
public static 
TForm frm;

public static 
void init(){
frm=new TForm();
h=frm.getHeight();
w=frm.getWidth();


Может это не совсем правильно, но работает.

Phantom 14.07.2008 13:32

Ответ: Пишем либы для MidletPascal на JAVA
 
Цитата:

Так это и есть на java.
Но ведь в Джаве без паскаля нет класса FW.

ViNT 14.07.2008 13:56

Ответ: Пишем либы для MidletPascal на JAVA
 
А... В этом смысле...
В java тоже должен быть главный класс мидлета, в нем - Display и т.д.

Phantom 14.07.2008 15:45

Ответ: Пишем либы для MidletPascal на JAVA
 
Понятно, спасибо =)
- - -
Написал я свою первую библиотеку!!! Ура, товарищи!!! Зацените, плиз:
http://wapcode.ru/Lib_st.zip
Там в файле внутри архива всё подробно описано, для чего она, и пример там же.

Piligrim 14.07.2008 23:05

Ответ: Пишем либы для MidletPascal на JAVA
 
У нас считается хорошим тоном выкладывать библиотеки в соответствующий раздел. Было бы неплохо поддержать эту традицию.

Phantom 16.07.2008 09:27

Ответ: Пишем либы для MidletPascal на JAVA
 
Слушайте. Есть две библиотеки. Одна - моя Lib_st, вторая - тоже я написал, но там тупо просто по экрану рисует. По отдельности они в мидлет паскале работают, а обе сразу - компиляция проходит, но мидлет сразу закрывается в эмуляторе =( В чём может быть дело? Не может быть путанницы в том, что я в обоих библиотеках использовал одинаковые названия глобальных переменных? Потому-что я уже не знаю, на что косить...
- - -
А можно из мидлет паскаля передать в качестве параметра функции массив в функцию, описанную в либе?
Как в Джаве массивы создавать?

ViNT 16.07.2008 16:24

Ответ: Пишем либы для MidletPascal на JAVA
 
По первому вопросу: из-за одинаковых переменных точно не может быть, чтобы понять в чем дело, нужен код библиотек и код на MP. По второму - массив передать нельзя, можно сделать так, чтобы массив с определенным именем создавался в программе, а библиотека напрямую читала данные из него. В java массивы создаются так:
PHP код:

public static String mass[]=null;

.....

mass=new String[10];//10-число элементов, нумерация с 0. 


Phantom 16.07.2008 16:44

Ответ: Пишем либы для MidletPascal на JAVA
 
А джава умеет увеличивать размер массива по ходу ввыполнения программы? Ну, например, я выделил 10 ячеек, а мне потом 11 понадобилось? На сколько я знаю, так нельзя ни в Джава, ни в С++... Почему такая недоработка языков?
Цитата:

mass=new String[10];//10-число элементов, нумерация с 0.
Это значит, что я буду иметь 10 ячеек: с mass[0] по mass[9] ИЛИ я буду иметь 11 ячеек с mass[0] по mass[10]?
А добавлять в массив значение обязательно с указанием индекса?
Или можно так: mass[]="Привет";
А ещё я читал, что массиввы в Джава памяти много кушают оперативной.
Какой размер массивва считается приемлемым, а какой перебором?
Ну вот, например, я хочу держать в памяти массив из 100 строковых ячеек, в каждой строка около 40 символов. Это нормально?
- - -
Извиняюсь, что осыпаю вопросами, но просто больше негде спрашивать.
Вот предположим мне нужно сделать такой эффект:
На экране что-то нарисовано. Нужно как бы наложить серую плёнку на весь экран. То есть выглядеть это будет, словно экран потемнел, потускнел типа =)
А потом взять и вернуть экран в предыдущее состояние. Видел подобный эффект в некоторых играх. Как это сделать - я даже не знаю с какой стороны подойти. В теории есть некоторые мысли. Скопировать в некий буфер (например в массив aarrggbb) каким-нибудь образом весь экран, потом пересчитать каждый пиксел в потускневший вид и вывести на экран. Потом вывести из буфера первоначальный вид экрана.
Есть другая мысль, без пересчёта пикселов вручную. Просто залить весь экран серым цветом с альфа-прозрачностью. Но его перед этим разумеется копировать, чтобы потом опять восстановить.
Так вот. Стоит ли вообще это всё делать? Возможно вся эта операция будет на столько медленной, что мой сименс, к примеру, будет 10 секунд эту "пелену" накладывать. О_о
- - -
Блин, где можно исходников на Джава найти? Побольше бы. Того глядишь, я сам разбираться буду потихоньку =)
= = =
Добавил позже:
Нашёл инфу по drawRGB()... Заюзал... Сделал типа тест...
Мой сименс показал 1 fps :'( То есть он успевает только одно перекрытие пеленой в секунду сделать. То есть собственно сама операция и длится секунду... Это очень плохо...

ViNT 16.07.2008 21:09

Ответ: Пишем либы для MidletPascal на JAVA
 
Цитата:

Сообщение от Phantom_wc (Сообщение 82385)
А джава умеет увеличивать размер массива по ходу ввыполнения программы? Ну, например, я выделил 10 ячеек, а мне потом 11 понадобилось? На сколько я знаю, так нельзя ни в Джава, ни в С++... Почему такая недоработка языков?

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

Цитата:

Сообщение от Phantom_wc (Сообщение 82385)
Это значит, что я буду иметь 10 ячеек: с mass[0] по mass[9] ИЛИ я буду иметь 11 ячеек с mass[0] по mass[10]?

10 ячеек c mass[0] по mass[9]

Цитата:

Сообщение от Phantom_wc (Сообщение 82385)
А добавлять в массив значение обязательно с указанием индекса?

Только по индексу.

Цитата:

Сообщение от Phantom_wc (Сообщение 82385)
А ещё я читал, что массиввы в Джава памяти много кушают оперативной.
Какой размер массивва считается приемлемым, а какой перебором?
Ну вот, например, я хочу держать в памяти массив из 100 строковых ячеек, в каждой строка около 40 символов. Это нормально?

Берешь LIb_memory и смотришь, сколько оперативки есть, сколько ест прога без массива, сколько ест с массиво, сколько остается, и смотришь, приемлемо это или нет.

Цитата:

Сообщение от Phantom_wc (Сообщение 82385)
- - -
Извиняюсь, что осыпаю вопросами, но просто больше негде спрашивать.
Вот предположим мне нужно сделать такой эффект:
На экране что-то нарисовано. Нужно как бы наложить серую плёнку на весь экран. То есть выглядеть это будет, словно экран потемнел, потускнел типа =)
А потом взять и вернуть экран в предыдущее состояние. Видел подобный эффект в некоторых играх. Как это сделать - я даже не знаю с какой стороны подойти. В теории есть некоторые мысли. Скопировать в некий буфер (например в массив aarrggbb) каким-нибудь образом весь экран, потом пересчитать каждый пиксел в потускневший вид и вывести на экран. Потом вывести из буфера первоначальный вид экрана.
Есть другая мысль, без пересчёта пикселов вручную. Просто залить весь экран серым цветом с альфа-прозрачностью. Но его перед этим разумеется копировать, чтобы потом опять восстановить.
Так вот. Стоит ли вообще это всё делать? Возможно вся эта операция будет на столько медленной, что мой сименс, к примеру, будет 10 секунд эту "пелену" накладывать. О_о
- - -

А просто. В PhotoShop'е делаешь изображение пленки(серый прямоугольник с нужной альфой), и в нужный момент просто выводишь его поверх сцены с помощью DrawImage. Это самый быстрый вариант.


Цитата:

Сообщение от Phantom_wc (Сообщение 82385)
Блин, где можно исходников на Джава найти? Побольше бы. Того глядишь, я сам разбираться буду потихоньку =)
= = =

Искать надо, сайтов с исходниками очень много. Но лучше брать не только исходники, но и хороший самоучитель - там вся объектная модель расписана, стандартные классы и все такое. Ну и доки из WTK читать, естесно.

Piligrim 16.07.2008 22:17

Ответ: Пишем либы для MidletPascal на JAVA
 
в Java есть еще понятие вектора, это безразмерный массив, грубо говоря, но и скорость его работы в разы ниже.


Часовой пояс GMT +4, время: 22:22.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot