|
FAQ Часто задаваемые вопросы |
07.07.2008, 14:49
|
#16
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Ответ: Пишем либы для MidletPascal на JAVA
Сообщение от Phantom_wc
Спасибо =) Как я понимаю, нужно при компиляции M.class в папку положить, чтобы компилятор не ругался, да?
|
Да.
Сообщение от Phantom_wc
Вот только, как вы понимаете, где писать M.G, а где, например, FW.fw?.. Я не знаю, как это называется, у меня с терминологией проблемы =) Грубо говоря, где вы вычитали через какие классы к каким кускам Джавы обращаться нужно?
|
Для этого нужно знать java, читать доки по ней.
Сообщение от Phantom_wc
Я к 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.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
07.07.2008, 15:51
|
#17
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Пишем либы для 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.*
Тогда в файл как бы подключатся все (вот опять забыл как правильно назвать, то ли функции, то ли методы, то ли классы) этого пакета.
Последний раз редактировалось Phantom, 07.07.2008 в 16:13.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
07.07.2008, 16:29
|
#18
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Ответ: Пишем либы для 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. Терминология не главное, я сам в ней иногда немного путаюсь, главное - понимать, как это работает.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
07.07.2008, 17:21
|
#19
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Пишем либы для MidletPascal на JAVA
Уже начинаю въезжать. Но терминалогию я плохо знаю, поэтому сложно даже вопросы задавать, так как не знаю как вещи правильно назвать. =) Что ж... Если смогу написать либу, то буду считать, что первый шаг сделан =)
|
(Offline)
|
|
08.07.2008, 05:25
|
#20
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Пишем либы для 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: подозреваю, что я опять всё напутал и вместо слова "функция" следовало употреблять слово "метод" =)
Последний раз редактировалось Phantom, 08.07.2008 в 08:03.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
08.07.2008, 08:33
|
#21
|
Мастер
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений (для 713 пользователей)
|
Ответ: Пишем либы для MidletPascal на JAVA
Сообщение от Phantom_wc
Блин, а что делать, если мне нужно глобальную переменную использовать? Ну я не знаю, как это в Джаве называется. То есть мне нужно в либе сделать несколько функций/процедур, которые будут использовать одни и те же переменные. Можно, конечно, сделать, чтобы функции возвращали значения, которые потом использовались бы в других функциях путём явной передачи их туда. Но дело в том, что там функция возвращает не одну переменную, а несколько. Может можно сделать что-то типа массива или... я даже не знаю. Чтобы в одной переменной сразу кучу передавать.
- - -
У меня класс есть, я его хотел подключить к мидлет паскалю хитрым способом. Типа написать либу, которая будет к тому классу обращаться по-мидлетпаскалевски, все процедуры объявил статичными, а при компиляции мне выдало, что те функции, к которым я пытаюсь обратиться из либы не являются статичными. То есть что, получается, я не могу из статичной функции одного класса обратиться к нестатичной функции другого класса? О_о Как выходить из такой ситуации?
- - -
В мидлет паскале можно создавать комбинированный тип данных. Полагаю, что это может пригодится, но как его связать с джавой?
- - -
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();
}
}
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
08.07.2008, 10:18
|
#22
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Пишем либы для MidletPascal на JAVA
Опа! Спасибо! Я почти так и делал, только эту строку не добавлял:
public static MyClass my;
Теперь всё откомпилировалось. И в мидлет паскале без ошибок откомпилировалось. Но программа не идёт. Запускаю на эмуляторе и он тут же закрывается. =(
В классе используются пакеты
import java.util.Vector;
import javax.microedition.lcdui.*;
Это имеет значение? В чём может быть дело?
- - -
Запустил на телефоне (Сименс С75). Прога запустилась. Просто белый экран. На функции из либы/класса повисло, иначе бы через 10 секунд прога сама закрылась бы, так как delay(10000); стоит.
|
(Offline)
|
|
08.07.2008, 11:05
|
#23
|
Оптимист
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений (для 259 пользователей)
|
Ответ: Пишем либы для MidletPascal на JAVA
M.G.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_ITALIC, Font.SIZE_SMALL);
не забываем
import javax.microedition.lcdui.Font;
PS: а где Вы простите создаете экземпляр класса my?
|
(Offline)
|
|
08.07.2008, 11:40
|
#24
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Пишем либы для MidletPascal на JAVA
1) На Font.getFont, а именно на Font ругается компилятор во всех местах, где я его пытаюсь использовать.
2) Что такое экземпляр? Я писал так, как в примере odd'а. Компиляция успешно прошла.
- - -
Это я хочу прикрутить класс для мультистрочного вывода текста к мидлет паскалевской программе =) А ещё лучше полностью его в либу переписать. Хочу понять, как вообще писать либы.
- - -
Добавил позднее:
Мда. Переписал весь класс в либу. Он откомпилировался. Положил его в мидлет паскаль. Написал прогу на мидлет паскале, нажимаю Буилд, он мне выдаёт, что одной из функций в либе нет. После 10 минут предпринимания всяких нелогичных действий я решил в либе поменять местами функции. То есть в принципе ничего не изменилось. Откомпилировал заново и, О ЧУДО, мидлет паскаль стал видеть все функции! Откомпилировалась прога, запускаю и... Опять просто белый экран =( Но теперь уже идёт на эмуляторе и закрыввается через 10 секунд =) Значит процедуры из либы не повисают, а выполняются =) Но должен текст выводиться на экран, блин!
P.S: Процедура, которую паскаль не хотел видеть, находилась в самом конце файла (либы имеется в виду). Возможно он не может длинные либы воспринимать как надо =( Тут уже кто-то писал, что в больших либах перестаёт видеть функции...
Последний раз редактировалось Phantom, 08.07.2008 в 12:22.
|
(Offline)
|
|
08.07.2008, 21:41
|
#25
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Пишем либы для MidletPascal на JAVA
Мдаааа... Откомпилировал этот класс, сделал всё на Джаве, вообще без мидлет паскаля... В эмуляторе идёт, отображается текст, работает прокрутка... А на моём сименсе при запуске ввыдаёт:
MIDlet initialization failed:
java.lang.Error: 56
Может это потому что текст в ANSI? Пробовал компилировать в UTF-8 - на эмуляторе просто белый экран, на телефоне не тестил.
Что-то с этим классом не то...
|
(Offline)
|
|
08.07.2008, 22:54
|
#26
|
Оптимист
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений (для 259 пользователей)
|
Ответ: Пишем либы для 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));
}
}
компилируется без ошибок, не забывайте о мелочах пожалуйста.
|
(Offline)
|
|
09.07.2008, 07:58
|
#27
|
Мастер
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений (для 713 пользователей)
|
Ответ: Пишем либы для MidletPascal на JAVA
Поделись исходниками, будем вместе думать почему там у тебя происходят ошибки и зависания. Попробуй в либу Lib_test добавить конструктор типа:
Lib_test
{
my = new Mylib();
}
А пока можешь потестить и сам. Не забывай, что в Java есть механизм обработки исключений. По-этому все потенциально опасные действия лучше делать, используя конструкцию try/catch:
try
{
с = a / b; // Опасное действие. А вдруг b равно 0 ?
}
catch (Exception e)
{
}
|
(Offline)
|
|
09.07.2008, 10:40
|
#28
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Пишем либы для 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?
Последний раз редактировалось Phantom, 09.07.2008 в 10:52.
|
(Offline)
|
|
09.07.2008, 11:42
|
#29
|
Оптимист
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений (для 259 пользователей)
|
Ответ: Пишем либы для MidletPascal на JAVA
http://forum.boolean.name/showthread.php?t=6093
ЗЫ: если так получается здесь почему есть уверенность, что получится на чистой яве?
|
(Offline)
|
|
09.07.2008, 13:16
|
#30
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Пишем либы для MidletPascal на JAVA
ЗЫ: если так получается здесь почему есть уверенность, что получится на чистой яве?
|
Да я не в том смысле. Я в смысле, что половину писать на джаве, половину на паскале... Зачем? Лучше уж сразу на джаве. =)
- - -
Вопрос не в тему: Почему когда я в свойствах проекта ставлю MIDP 2.0, то приложения получаются неполноэкранные? А когда MIDP 1.0, то всё нормально. Телефон Сименс С75. Сверху и снизу остаются полоски с картинкой, которая в теме телефона установлена. То есть площадь канваса становится примерно 132x148 вместо 132x176 О_о
- - -
Добавлено гораздо позже:
Разобрался, поставил другую версию паскаля с сайта ODD'а.
- - -
У меня не получается сделать класс и либу. Вот я хочу, например, сделать класс, чтобы он весь экран заливал тёмносерым цветом.
Файл gr.java:
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:
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; // *********************************** }
Пишу в мидлет паскале:
program canvas; uses fc; begin fc.init; fc.background; repaint; delay(10000); end.
В чём ошибка? Что я делаю не так? Всё это, что я выше написал, нормально компилируется, но при запуске проги хоть на эмуляторе, хоть на телефоне просто белый экран, как и всегда по умолчанию...
Последний раз редактировалось Phantom, 09.07.2008 в 19:00.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:47.
|