<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Cross-Platform Programming with wxWidgets &#187; wxJavaScript</title>
	<atom:link href="http://wxwidgets.info/category/wxjavascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://wxwidgets.info</link>
	<description>Just Make It Cross-Platform</description>
	<lastBuildDate>Tue, 09 Mar 2010 20:50:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>wxJavaScript &#8211; Кросс-платформенный скриптинг десктопных приложений. Знакомство</title>
		<link>http://wxwidgets.info/wxjavascript-kross-platformennyj-skripting-desktopnyx-prilozhenij-znakomstvo/</link>
		<comments>http://wxwidgets.info/wxjavascript-kross-platformennyj-skripting-desktopnyx-prilozhenij-znakomstvo/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 13:20:33 +0000</pubDate>
		<dc:creator>T-Rex</dc:creator>
				<category><![CDATA[wxJavaScript]]></category>
		<category><![CDATA[wxWidgets]]></category>
		<category><![CDATA[Статьи]]></category>

		<guid isPermaLink="false">http://wxwidgets.info/?p=489</guid>
		<description><![CDATA[Давно уже хотел написать по поводу wxJavaScript. По-моему сейчас как раз пришло время для этого, т.к. проект уже успел развиться до такого состояния, когда все работает более-менее стабильно. Итак, что же это за зверь wxJavaScript? Проект начинался как обычный порт wxWidgets на JavaScript, но, со временем, &#8220;оброс&#8221; библиотеками, которых в wxWidgets отродясь не было. Это [...]]]></description>
			<content:encoded><![CDATA[<p>Давно уже хотел написать по поводу <a href="http://www.wxjavascript.net/" title="Официальный сайт wxJavaScript">wxJavaScript</a>. По-моему сейчас как раз пришло время для этого, т.к. проект уже успел развиться до такого состояния, когда все работает более-менее стабильно.<br />
Итак, что же это за зверь wxJavaScript? Проект начинался как обычный порт wxWidgets на JavaScript, но, со временем, &#8220;оброс&#8221; библиотеками, которых в wxWidgets отродясь не было. Это модули curl, sqlite, mysql и др. Также проект получил реинкарнацию в виде модуля к Apache, который может использоваться для создания динамических HTML-страниц. Но об этом потом. Сейчас мне бы хотелось рассказать о том, как этим всем можно пользоваться для достижения собственных <s>корыстных</s> целей.<br />
<span id="more-489"></span><br />
wxJavaScript поставляется в виде исполняемого файла интерпретатора и дополнительных модулей в виде динамических библиотек. Перечень используемых модулей может изменяться в конфигурационном файле. Это значит, что если на вашей машине используются скрипты только для доступа к базам данных, то нет никакой необходимости подключать, например библиотеку для создания графического интерфейса. Это позволяет экономить память, используемую движком wxJavaScript.<br />
Минимальное приложение для wxJS выглядит так:</p>
<p><strong>minimal.js</strong></p>
<pre class="brush: jscript;">
print(&quot;Hello World !!!&quot;);
</pre>
<p>Запустить скрипт на выполнение можно командой</p>
<pre class="brush: jscript;">
wxjs minimal.js
</pre>
<p>Теперь рассмотрим, как создать минимальное приложение с графическим интерфейсом.</p>
<p><strong>minimal_gui.js</strong></p>
<pre class="brush: jscript;">
wxTheApp.onInit = init;

function init()
{
  var frame = new wxFrame(null, -1, &quot;Minimal&quot;);
  frame.visible = true;
  wxTheApp.topWindow = frame;
  return true;
}
</pre>
<p>Для того, чтобы наше приложение запустилось, нам необходимо включить поддержку графического интерфейса в конфигурационном файле:</p>
<p><strong>modules.js</strong></p>
<pre class="brush: jscript;">
...
wxjs.modules.io = new Module(&quot;../modules/wxjs_gui.dll&quot;);
wxjs.modules.io.load();
...
</pre>
<p><img src="http://wxwidgets.info//wp-content/uploads/2009/01/wxjs_minimal_gui.png" alt="wxJavaScript - Минимальное приложение с графическим интерфейсом" title="wxJavaScript - Минимальное приложение с графическим интерфейсом" width="400" height="250" class="alignnone size-full wp-image-490" /><br />
В принципе, API очень схож с wxWidgets API для C++, но есть некоторые особенности. Например, обработчики событий от меню  навешиваются к объекту меню через массив <code>actions</code>, а не к форме.<br />
Давайте рассмотрим более сложный пример программы с графическим интерфейсом, использующий обработчики событий.</p>
<p><strong>advanced_gui.js</strong></p>
<pre class="brush: jscript;">
// Указываем что при инициализации приложения должна
// вызваться функция init
wxTheApp.onInit = init;

function OnFileNew()
{
  this.textCtrl.value = &quot;&quot;;
}

function OnFileOpen()
{
  // Создаем диалог открытия файла
  var fileDialog = new wxFileDialog(this, &quot;Open a file&quot;);
  // Устанавливаем стиль диалога
  fileDialog.style = wxFileDialog.OPEN;
  // Если диалог отработал успешно...
  if(fileDialog.showModal() == wxId.OK)
  {
    // Загружаем файл в текстовое поле
    this.textCtrl.loadFile(fileDialog.path);
  }
}

function OnFileSave()
{
  var fileDialog = new wxFileDialog(this, &quot;Save file&quot;);
  fileDialog.style = wxFileDialog.SAVE;
  if(fileDialog.showModal() == wxId.OK)
  {
    this.textCtrl.saveFile(fileDialog.path);
  }
}

function OnFileExit()
{
  this.close();
}

function CreateMenuBar(parent)
{
  // Создаем строку меню
  var menuBar = new wxMenuBar(parent);

  // Создаем меню &quot;Файл&quot;
  var fileMenu = new wxMenu;
  // Добавляем в меню элементы
  fileMenu.append(wxId.NEW, &quot;New\tCtrl+N&quot;, &quot;Create new file&quot;);
  fileMenu.append(wxId.OPEN, &quot;Open\tCtrl+O&quot;, &quot;Open existing file&quot;);
  fileMenu.appendSeparator();
  fileMenu.append(wxId.SAVE, &quot;Save\tCtrl+S&quot;, &quot;Save file&quot;);
  fileMenu.appendSeparator();
  fileMenu.append(wxId.EXIT, &quot;Exit\tAlt+F4&quot;, &quot;Exit this application&quot;);

  // Назначаем обработчики событий
  fileMenu.actions[wxId.NEW] = OnFileNew;
  fileMenu.actions[wxId.OPEN] = OnFileOpen;
  fileMenu.actions[wxId.SAVE] = OnFileSave;
  fileMenu.actions[wxId.EXIT] = OnFileExit;

  // Добавляем меню в строку меню
  menuBar.append(fileMenu, &quot;File&quot;);
  return menuBar;
}

// Функция создания главной формы
function CreateFrame()
{
  // Создаем форму
  var frame = new wxFrame(null, -1, &quot;Minimal&quot;);
  // Создаем строку меню с помощью функции CreateMenuBar()
  frame.menuBar = CreateMenuBar();
  // Создаем строку состояния с двумя панелями
  frame.createStatusBar(2);

  // Создаем главный сайзер
  var mainSizer = new wxBoxSizer(wxOrientation.VERTICAL);

  // Создаем текстовое поле
  var textCtrl = new wxTextCtrl(frame, wxId.HIGHEST+1, &quot;&quot;,
    wxDefaultPosition, wxDefaultSize, wxTextCtrl.MULTILINE);

  // Добавляем текстовое поле в сайзер
  mainSizer.add(textCtrl, 1, wxStretch.EXPAND, 0);

  // Кладем сайзер на форму
  frame.sizer = mainSizer;
  // Устанавливаем значение переменной textCtrl в главной форме
  frame.textCtrl = textCtrl;

  return frame;
}

// Инициализация приложения
function init()
{
  // Создаем форму с помощью функции CreateFrame();
  var frame = CreateFrame();
  // Делаем форму вилимой
  frame.visible = true;
  // Делаем форму главной
  wxTheApp.topWindow = frame;
  return true;
}
</pre>
<p><img src="http://wxwidgets.info//wp-content/uploads/2009/01/wxjs_advanced_gui.png" alt="wxJavaScript - Более сложный пример приложения с графическим интерфейсом" title="wxJavaScript - Более сложный пример приложения с графическим интерфейсом" class="alignnone size-full wp-image-491" /><br />
Как видно из скриншота, приложение занимает 18 МБ памяти. Минимальное приложение занимало приблизительно 12 МБ. Эти 6 мегабайт разницы &#8220;съедает&#8221; поддержка Common Dialogs при первом обращении, а именно при открытии диалога открытия файла.</p>
<p>Кроме всего прочего, wxJS поддерживает работу с базами данных. Ниже приведен код примера, который выполняет соединение с базой данных SQLite, при необходимости, создает таблицы в базе данных, заполняет их данными и отображает содержимое таблиц.</p>
<p><strong>database.js</strong></p>
<pre class="brush: jscript;">
// Открываем базу данных
var db = new sqlite.Database(script.root + &quot;sample.db&quot;);
// Если база была открыта успешно...
if(db.opened)
{
  print(&quot;Database opened successfully.\r\n&quot;);
  // Хитрая проверка на наличие таблиц с помощью PRAGMA
  var pragmaStmt = db.prepare(&quot;PRAGMA user_version&quot;);
  var pragma = pragmaStmt.fetchArray();
  if(pragma[0] == 0)
  {
    // Создаем таблицы в базе данных
    print(&quot;Creating tables...\r\n&quot;);
    print(db.exec(&quot;CREATE TABLE sample(id INTEGER PRIMARY KEY, somedata TEXT)&quot;));
    print(&quot;Inserting data...\r\n&quot;);
    // Заполняем таблицы данными
    print(db.exec(&quot;INSERT INTO sample(somedata) VALUES ('test 1')&quot;)+&quot;\r\n&quot;);
    print(db.exec(&quot;INSERT INTO sample(somedata) VALUES ('test 2')&quot;)+&quot;\r\n&quot;);
    // Устанавливаем флаг наличия таблиц
    db.exec(&quot;PRAGMA user_version = 1&quot;);
  }
  // Получаем данные из таблицы
  print(&quot;Fetching data...\r\n&quot;);
  var stmt = db.prepare(&quot;SELECT * FROM sample&quot;);
  // если получилось вытянуть данные...
  if(stmt != null)
  {
    var row;
    // Выводим все записи в консоль
    while(row = stmt.fetchObject())
    {
      print(row.id + &quot;: &quot; + row.somedata + &quot;\r\n&quot;);
    }
  }
  else
  {
   print(&quot;Unable to fetch data.\r\n&quot;);
  }
}
else
{
  print(&quot;Error opening database.&quot;);
}
</pre>
<p>Ну вот, пока на этом все. Более подробно об API wxJavaScript можно почитать на <a href="http://www.wxjavascript.net/" title="Официальный сайт wxJavaScript">официальном сайте</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://wxwidgets.info/wxjavascript-kross-platformennyj-skripting-desktopnyx-prilozhenij-znakomstvo/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
