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)

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

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


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

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