OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 23:39

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: GUI для GPCP (JVM)
СообщениеДобавлено: Понедельник, 12 Октябрь, 2009 13:11 

Зарегистрирован: Суббота, 06 Июнь, 2009 07:52
Сообщения: 329
Нашел в Интернете исходники и библиотеки небольшого проекта. http://japi.de Сама библиотека написана на С, а скомпилированная программа использует Java. Также есть привязки к другим языкам и мне удалось переписать интерфейсный модуль и некоторые примеры на КП. Думаю переписать на КП всю библиотеку. На сайте достаточно примеров, чтобы собрать графический редактор. Однако, никак не получается запустить gpcp и в Linux’е, и в Windows. Неизменно появляется ошибка
Код:
Exception in thread "main" java.lang.NoClassDefFoundError: CP/gpcp/gpcp
Пути прописываю, а где ошибся не пойму. В ВВ под Windows japi-примеры запускаются нормально. Хотелось бы узнать Ваше мнение о том, какие перспективы сделать из такой библиотеки подсистему для gpcp и полноценный графический редактор. Ежели кому интересно, то могу выложить свои исходники.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GUI для GPCP (JVM)
СообщениеДобавлено: Понедельник, 12 Октябрь, 2009 13:43 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Вы указываете непосредственно класс запуска? Тогда он должен выглядеть так: java.exe CP.gpcp.gpcp

Или неправильно указана текущая директория. В ней должна быть поддиректория (а вернее, пакет) CP, в котором должна быть поддиректория gpcp и т.д.

Если Вы указываете класс, то не надо добавлять расширение.

Этих замечаний достаточно, если Вы используете java.exe напрямую. Если же он вызывается косвенно (средой разработки или ещё чем), то с помощью настроек нужно добиться того, о чём я сказал выше.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GUI для GPCP (JVM)
СообщениеДобавлено: Понедельник, 12 Октябрь, 2009 19:02 

Зарегистрирован: Суббота, 06 Июнь, 2009 07:52
Сообщения: 329
В Linux я запускаю скрипт
Код:
#!/bin/sh
# run a Component Pascal Program
#
java -DCPSYM=.:$CPROOT/libs:$CPROOT/libs/JvmSystem -classpath .:$CPROOT CP.$1.$1 $2 $3 $4 $5 $6 $7 $8 $9
#
Переменные выглядят так
Код:
> CLASSPATH=.:/usr/local/gpcp
> CPROOT=.:/usr/local/gpcp
> CPSYM=.:/usr/local/gpcp/libs:/gpcp/libs/JvmSystem
> PATH=/...:/usr/local/gpcp/bin
Каталоги соответствуют.
Строки запуска и выполнения
Код:
> cprun gpcp File.cp
> cprun File


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GUI для GPCP (JVM)
СообщениеДобавлено: Вторник, 13 Октябрь, 2009 11:16 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
У нас делают так:
Код:
#!/bin/bash
export LANG=ru_RU.cp1251
export LC_ALL=ru_RU.cp1251
JAVA_HOME=/usr/java

nohup $JAVA_HOME/bin/java -Xmx1024m -Xss128k -cp .:./libs/base-opt.jar:./libs/castor-1.0-xml.jar:./libs/commons-collections-3.1.jar server/Server >/dev/null &
sleep 3
ps axo pid,args | grep "libs/base-opt.jar" | grep -v grep | awk '{print $1}' | sed '1!d' > $PID_FILE
jar - это не файл, а директория. Его в -cp прописывают явно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GUI для GPCP (JVM)
СообщениеДобавлено: Среда, 14 Октябрь, 2009 17:31 

Зарегистрирован: Суббота, 06 Июнь, 2009 07:52
Сообщения: 329
Я попытался запустить Ваш скрипт. Он выдает ошибку:
Код:
line 8: $PID_FILE: ambiguous redirect

Т.к. в оригинале jar-файлов нет, то копировал в директорию с библиотеками jar-файлы из проекта GPCP Ant Task. Точной ссылки не найду, но можно поискать по адресу http://leonardoce.interfree.it/index.html Если я правильно понял, это компоновщик подобный тому, что есть в Eclipce.

Скрипт cprun, который я привел выше -- это для компиляции и запусуска стандартная программа из архива, взятого с сайта разработчиков http://plas.fit.qut.edu.au/gpcp/. Он в точности повторяет(со своей спецификой обозначения переменных) содержание bat-файла Windows-версии, в которой мне удалось запустить только консольные примеры. Единственный пример апплета после компиляции при запуске выдает ошибку:
Код:
java.lang.NoSuchMethodError: main

Теперь не знаю как правильно вставить процедуру main в исходный текст модуля, учитывая специфику КП.

P.S. Просьба, если кто использовал GPCP Ant Task, объясните как его установить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GUI для GPCP (JVM)
СообщениеДобавлено: Среда, 14 Октябрь, 2009 18:50 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Скорее всего, в апплете и не должно быть процедуры main: он не запускается из командной строки. Откройте html-файл, и апплет отобразится в браузере.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GUI для GPCP (JVM)
СообщениеДобавлено: Пятница, 16 Октябрь, 2009 10:39 

Зарегистрирован: Суббота, 06 Июнь, 2009 07:52
Сообщения: 329
Теперь, когда и Linux-, и Windows-версии gpcp нормально компилируют программы и работа апплета проверена, запуск на выполнение Japi-примера по-прежнему выдает ошибку:
Код:
 Exception in thread "main" java.lang.NoSuchMethodError: main

В документации на Japi написано, что она использует AWT. В ВВ под Windows этот пример нормально запускался. А gpcp даже не пытается загрузить Japi-ядро или до этого процесс не доходит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GUI для GPCP (JVM)
СообщениеДобавлено: Пятница, 16 Октябрь, 2009 12:21 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
А как выглядит сам пример, который не удаётся запустить?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GUI для GPCP (JVM)
СообщениеДобавлено: Пятница, 16 Октябрь, 2009 14:32 

Зарегистрирован: Суббота, 06 Июнь, 2009 07:52
Сообщения: 329
Извиняюсь за небрежно написанный код (от рудиментов FreePascal'я и т.д.). Писал для эксперимента: лишь бы запустить и отценить перспективу работы. От этого, возможно, ошибки.

Версия для GPCP:
Код:
FOREIGN MODULE Japi ["japi.dll"];
IMPORT java_lang, Console;

CONST
    (*  BOOLEAN   *)
    J_TRUE                                  *= TRUE;
    J_FALSE                                 *= FALSE;
    (*  ALIGNMENT   *)
    J_LEFT                                  *=    0;
    J_CENTER                                *=    1;
    J_RIGHT                                 *=    2;
    J_TOP                                   *=    3;
    J_BOTTOM                                *=    4;
   
   ........................................
   ........................................

TYPE
      int = INTEGER;
      pchar = ARRAY OF CHAR;
      PChar = INTEGER;

(* Externe Funktionen *)
PROCEDURE J_start*(): BOOLEAN;
   ........................................
PROCEDURE J_frame*( arg0 : pchar ): int;
   ........................................
PROCEDURE J_button*( arg0 : int ; arg1 : pchar ): int;
   ........................................
PROCEDURE J_setborderpos*( arg0 : int ; arg1 : int );
   ........................................
PROCEDURE J_show*( arg0 : int );
   .....................................
PROCEDURE J_nextaction*(): int;
   .....................................
PROCEDURE J_quit*;
   .....................................
PROCEDURE J_filedialog*( arg0 : int ; arg1 : pchar ; arg2 : pchar ; arg3 : pchar ): PChar;
   ....................................
PROCEDURE J_fileselect*( arg0 : int ; arg1 : pchar ; arg2 : pchar ; arg3 : pchar ): PChar;
   ....................................
   ....................................
END Japi.

Код:
MODULE Borderlayout;

IMPORT Japi, Console;

VAR
    frame,left,right,bottom,top,center    : INTEGER;

PROCEDURE JBorderlayout*;

BEGIN
       
    IF Japi.J_start() = Japi.J_FALSE THEN
        Console.WriteString('cannot connect to JAPI Kernel'); Console.WriteLn;
        HALT(0)
    END;
   
    frame := Japi.J_frame('Border Layout');
   
    Japi.J_setborderlayout(frame);

    right  := Japi.J_button(frame,'Right');
    left   := Japi.J_button(frame,'Left');
    bottom := Japi.J_button(frame,'Bottom');
    top    := Japi.J_button(frame,'Top');
    center := Japi.J_button(frame,'Center');

    Japi.J_setborderpos(right,Japi.J_RIGHT);
    Japi.J_setborderpos(left,Japi.J_LEFT);
    Japi.J_setborderpos(bottom,Japi.J_BOTTOM);
    Japi.J_setborderpos(top,Japi.J_TOP);
 
 
    Japi.J_show(frame);
       
    WHILE Japi.J_nextaction() # frame DO END;

Japi.J_quit;

END JBorderlayout;

END Borderlayout.


Верся для Blackbox
Код:
MODULE JapiInterface ["japi.dll"];
IMPORT WinApi;

CONST
    (*  BOOLEAN   *)
    J_TRUE                                  *= TRUE;
    J_FALSE                                 *= FALSE;
    (*  ALIGNMENT   *)
    J_LEFT                                  *=    0;
    J_CENTER                                *=    1;
    J_RIGHT                                 *=    2;
    J_TOP                                   *=    3;
    J_BOTTOM                                *=    4;
   
   ........................................
   ........................................

TYPE
   int = INTEGER;
   pchar = WinApi.PtrSTR;
   Pchar = WinApi.PtrSTR;

(* Externe Funktionen *)
PROCEDURE J_start*(): BOOLEAN;
   ........................................
PROCEDURE J_frame*( arg0 : pchar ): int;
   ........................................
PROCEDURE J_button*( arg0 : int ; arg1 : pchar ): int;
   ........................................
PROCEDURE J_setborderpos*( arg0 : int ; arg1 : int );
   ........................................
PROCEDURE J_show*( arg0 : int );
   .....................................
PROCEDURE J_nextaction*(): int;
   .....................................
PROCEDURE J_quit*;
   .....................................
PROCEDURE J_filedialog*( arg0 : int ; arg1 : pchar ; arg2 : pchar ; arg3 : pchar ): PChar;
   ....................................
PROCEDURE J_fileselect*( arg0 : int ; arg1 : pchar ; arg2 : pchar ; arg3 : pchar ): PChar;
   ....................................
   ....................................
END JapiInterface.

Код:
MODULE  JapiBorderlayout;

IMPORT JapiInterface, StdLog;

VAR
    frame,left,right,bottom,top,center    : INTEGER;

PROCEDURE Borderlayout*;

BEGIN
       
    IF JapiInterface.J_start() = JapiInterface.J_FALSE THEN
        StdLog.String('cannot connect to JAPI Kernel'); StdLog.Ln;
        HALT(0)
    END;
   
    frame := JapiInterface.J_frame('Border Layout');
   
    JapiInterface.J_setborderlayout(frame);

    right  := JapiInterface.J_button(frame,'Right');
    left   := JapiInterface.J_button(frame,'Left');
    bottom := JapiInterface.J_button(frame,'Bottom');
    top    := JapiInterface.J_button(frame,'Top');
    center := JapiInterface.J_button(frame,'Center');

    JapiInterface.J_setborderpos(right,JapiInterface.J_RIGHT);
    JapiInterface.J_setborderpos(left,JapiInterface.J_LEFT);
    JapiInterface.J_setborderpos(bottom,JapiInterface.J_BOTTOM);
    JapiInterface.J_setborderpos(top,JapiInterface.J_TOP);
 
 
    JapiInterface.J_show(frame);
       
    WHILE JapiInterface.J_nextaction() # frame DO END;

JapiInterface.J_quit;

END Borderlayout;

END JapiBorderlayout.


Может быть ошибка в типах. В случае с ВВ зависимость от модуля WinApi существует.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GUI для GPCP (JVM)
СообщениеДобавлено: Суббота, 17 Октябрь, 2009 10:39 

Зарегистрирован: Суббота, 06 Июнь, 2009 07:52
Сообщения: 329
Тот же самый пример на языке Java можно написать следующим образом:
Код:
 import java.awt.*; 
import java.awt.event.* ;
class BorderTest extends Frame{ 
BorderTest(String s){ super(s);
add(new Button("North"), BorderLayout.NORTH); 
add(new Button("South"), BorderLayout.SOUTH); 
add(new Button("West"), BorderLayout.WEST); 
add(new Button("East"), BorderLayout.EAST); 
add(new Button("Center")); 
setSize(300, 200); 
setVisible(true); 

public static void main(String[] args){
Frame f= new BorderTest(" Менеджер BorderLayout"); 
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
System.exit(0); 
}
}

}

Саму рамку создает процедура main, которой не хватает в исходнике для gpcp. Мне казалось, что именно J_frame из Japi.dll создает окно. Однако в си-шных исходниках Japi эквивалентного участка кода я не нашел. Если процедура main требуется, то возникает такой общий вопрос: GPCP – это компилятор языка КП, который на выходе создает программу понятную для выполнения интерпретатором Java, или GPCP – это Java-утилита, которая на входе читает исходный текст на КП? Во втором случае проектировать GUI для GPCP смысла не имеет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GUI для GPCP (JVM)
СообщениеДобавлено: Воскресенье, 18 Октябрь, 2009 00:35 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Судя по способу запуска программ от gpcp, то это всё-таки компилятор. Он создаёт один или несколько классов, которые затем выполняются в jre.

Похоже, аналогом main является секция инициализации модуля. Больше пока не разбирался.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GUI для GPCP (JVM)
СообщениеДобавлено: Воскресенье, 18 Октябрь, 2009 15:21 

Зарегистрирован: Среда, 04 Июль, 2007 16:43
Сообщения: 247
Valery Solovey писал(а):
Судя по способу запуска программ от gpcp, то это всё-таки компилятор. Он создаёт один или несколько классов, которые затем выполняются в jre.

Похоже, аналогом main является секция инициализации модуля. Больше пока не разбирался.


Совершенно верно: в .NET для создания exe файла требуется IMPORT CPmain. Без CPmain будет создана dll.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GUI для GPCP (JVM)
СообщениеДобавлено: Воскресенье, 18 Октябрь, 2009 17:03 

Зарегистрирован: Суббота, 06 Июнь, 2009 07:52
Сообщения: 329
QWERTYProgrammer писал(а):
Valery Solovey писал(а):
Судя по способу запуска программ от gpcp, то это всё-таки компилятор. Он создаёт один или несколько классов, которые затем выполняются в jre.

Похоже, аналогом main является секция инициализации модуля. Больше пока не разбирался.


Совершенно верно: в .NET для создания exe файла требуется IMPORT CPmain. Без CPmain будет создана dll.

Интересно, я только сейчас заметил, что пример "Hello"(слишком простой пример) импортирует модуль CPmain, а пример апплета импортирует CPJ, которые не используются явным образом в исходном тексте программы. Импортировал их в свой пример. Теперь компиляция и запуск программы проходят без ошибок, однако, все равно, ни окно, ни текстовое сообщение не появляются.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GUI для GPCP (JVM)
СообщениеДобавлено: Воскресенье, 18 Октябрь, 2009 17:21 

Зарегистрирован: Среда, 04 Июль, 2007 16:43
Сообщения: 247
Можно спросить в т.ч. автора GPCP здесь:
GPCP · Gardens Point Component Pascal


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GUI для GPCP (JVM)
СообщениеДобавлено: Пятница, 23 Октябрь, 2009 10:10 

Зарегистрирован: Суббота, 06 Июнь, 2009 07:52
Сообщения: 329
Т. к. Japi-библиотека написана на си, то я полагаю, что она является heavy-интерфейсом AWT. Тогда, для программы, запускаемой с помощью Japi.dll из ВВ, создается peer-to-peer-интерфейс, который не возможно создать в GPCP штатными средствами.
О процедуре main в ReleaseNotes1.3JVM говорится следующее:
Код:
 4.1 Class files and entry points
The compiler produces one or more class files from each module which it compiles. Classes may be dynamically loaded, or may contain an entry point with the Java language signature —
public static void main(java.lang.string[] args)
This entry point method takes a possibly empty array of native-strings as argument. Any command line arguments are accessed through the library ProgArgs. If the source file contains the import of the special module name CPmain, then an class file with an entry point is produced as output. In this case the module body becomes the method “main”, and begins with a hidden call which saves any command line arguments so that they may be later accessed by calls to the ProgArgs library. If the source file does not import CPmain then the module body becomes the “class constructor” which is executed at the time that class is loaded on demand.

Я предлагаю всем желающим совместными усилиями разработать и интегрировать в GPCP графический пакет так, чтобы он не мешал запускать в ВВ модули, написанные в GPCP.
Еще один вопрос об импортировании в GPCP dll-файлов. Видимо, такой возможности нет. Термин «FOREIGN» относится к модулям, написанным на языке Java или C# в версии для .NET. Надо отметить, что ВВ запускает модуль с импортированной Japi.dll, которая находится в каталоге …JRE\BIN.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB