Page 5 of 5

Re: Создание приложений на классах

Posted: Sat Jan 10, 2015 6:59 pm
by pascualle
что мы видим:

label.h

Code: Select all

class Label : public Control {
public:
	char* text;
}
потом

test.cpp

Code: Select all

this->txt = new Label();
this->txt->text = "Test Text";
Ошибка:
- ты пытаешься присвоить указателю this->txt->text адрес строки, созданной на статике в функции ApplicationWindow::init()
другими словами, то, что оно работает, это очень частный случай, так как у тебя все выполняется в теле этой самой функции. За пределами нее указатель text будет указывать на мусор. Следи на warnings компилятора.

Если ты хочешь присвоить строку переменной в этом случае нужно сделать это так:
static const sText[] = "Test Text";
this->txt->text = new char[strlen(sText) + 1];
strcpy(this->txt->text, sText);

далее, прямой доступ к мемберам класса -- это плохо. Очень настоятельно рекомендую использовать сетеры-гетеры, например

Code: Select all

label.h

class Label : public Control
{
private:

     void ReleaseText();
     char* text;

public:

   Label(); 
 ~Label();

  void SetCaption(const char* txt);
  const char* GetCaption() const;
}

label.cpp

Label()
:text(NULL) // обезопасим все указатели, обнуляя их
{
} 

~Label()
{
   ReleaseText(); // удаляем текст, если он есть  
}

ReleaseText()
{
   if(text != NULL)
   {
     delete[] text;
     text = NULL;
    }
}

void Label::SetCaption(const char* txt)
{
    ReleaseText();
    text = new char[strlen(txt) + 1];
    strcpy(text, sText);
}

Re: Создание приложений на классах

Posted: Sat Jan 10, 2015 7:05 pm
by pascualle
кстати, у тебя сишный стиль. Раз уж используешь с++, используй хотя бы std::string

#include <string>

class Label : public Control {
public:
std::string text;
}

this->txt = new Label();
this->txt->text = "Test Text"; // вот теперт это сработает, более того, можно менять данные text

Re: Создание приложений на классах

Posted: Sat Jan 10, 2015 7:17 pm
by Nikolai1
кстати, у тебя сишный стиль. Раз уж используешь с++, используй хотя бы std::string
Я только учусь))) :wink:
а под Kolibri разве есть std::string?

Re: Создание приложений на классах

Posted: Mon Jan 12, 2015 1:45 pm
by Nikolai1
займусь переделыванием классов... А проблему с BoxLib не получилось найти? ;-)

Re: Создание приложений на классах

Posted: Wed Jan 28, 2015 7:04 pm
by Nikolai1
Сделал свою библиотеку полностью самодостаточной. Никаких функций из файлов
#include <kosSyst.h>
#include <kosFile.h>
Теперь не используется.

Теперь библиотека работает в отдельном пространстве имён, guik, интегрирован мой класс mstring (самодельный аналог класса string с минимальным количеством функций)
Новый пример использования

Code: Select all

#include <kosSyst.h>
#include <kosFile.h>

#include "mylib\core.h"

class ApplicationWindow : public guik::Window {
public:
	guik::Label* txt;
	ApplicationWindow() : Window("Hello, C++") {
		this->txt = new guik::Label("Is is my framework!!!!", 10, 10, COLOR_LIME);
		this->txt->setText("Is is my small framework!!!");

		this->setSizeX(500);
		this->setSizeY(300);
		this->addControl(this->txt);
	};
};

void kos_Main() {
	using guik::Application;
	kos_GetSystemClock(); // Костыль! Почему то VSC++ не хочет компилировать без этой строчки :-D

	Application::setWindow(new ApplicationWindow());
	Application::run();
}
В ближайшее время собираюсь выложить, я вроде тестирую, но хотелось бы, чтобы потестировали другие программисты :wink:
Для этого постараюсь составить небольшую документацию и выложу примеры использования с комментариями

Re: Создание приложений на классах

Posted: Fri Jan 30, 2015 10:43 pm
by Nikolai1
Мой фреймворк теперь есть на GitHub!
https://github.com/npaukov/guik

Представляю новую версию:
GUIK LIB 0.0.4
- Библиотека стала полностью самодостаточной. Для использования не нужно подключать никаких дополнительных библиотек
- Теперь библиотека работает в отдельном пространстве имён guik, чтобы не конфликтовать с другими библиотеками
- Было произведено много различных исправлений
- Добавлен класс mstring, это что-то вроде аналога класса string с минимальным набором функций. Он теперь используется во всех
модулях библиотеки, где нужно хранить какие-либо строки, например надпись или заголовок окна
- Добавлена возможность искусственно вызвать событие нажатия на клавишу или клика по кнопке в окне
win->setClickButtonId(ID_кнопки);
win->setLastKeyCode(ID_клавиши);
- Теперь для доступа к свойствам элементов используются только set* и get* методы
- Переименован класс OffcutCustomFigure в OffcutPolygon
- Добавлена возможность обработки нажатия клавиши в окне
- Добавлена возможность создавать кнопку с текствовой надписью, а не просто залитую цветом
+ Можно указывать отступы для надписи относительно краёв кнопки,
размер кнопки в таком случае высчитывается автоматически

Re: Создание приложений на классах

Posted: Tue May 05, 2015 4:14 am
by punk_joker
А пример сделанный с использованием последей версии фреймворка?

Re: Создание приложений на классах

Posted: Tue May 05, 2015 3:00 pm
by Nikolai1
punk_joker wrote:А пример сделанный с использованием последей версии фреймворка?
Сейчас делаю новую версию, с нуля. "ядро" уже сделано, есть несколько элементов интерфейса.
Если разберусь с компилятором, то скоро выложу... Пока пишу и компилирую под Windows, вместо функций Kolibri использую пустые обёртки, чтобы компилировалось. Никаких библиотек не использую. Даже классы string и vector самописные. А код приложения вот такой примерно получается:

Code: Select all

#include "lib/guik.h"

using namespace guik;

int main() {
	Application app = Application::getInstance();	

	Window win;

	win.setPosition(20, 20);
	win.setSize(400, 200);
	win.title = "My window!";
	win.color = Color(255, 0, 0);
	win.name = "Win1";
	win.setId(1);

	Button button;
	button.setPosition(10, 10);
	button.setSize(75, 25);
	button.text = "Hello!";
	button.backgroundColor.setColor(255, 0, 0);
	button.textColor.setColor(0, 0, 0);
	button.name = "Button";
	button.setId(2);

	win->addChild(&button);

	app.setWindow(&win);

	while (app.run()) {
		guik::debug("Iteration start!");
	}


	return 0;
}

Re: Создание приложений на классах

Posted: Tue May 05, 2015 8:35 pm
by Nikolai1
Из основных изменений новой версии:
- новая, более гибкая структура классов (без костылей прошлой версии)
- Использование newlib вместо smalllibc
- возможность добавлять для элемента дочерние (зависимые) элементы. В таком случае, если скрыть родительский элемент, будут скрыты и дочерние элементы. Так же дочерние элементы позиционируются не относительно окна, а относительно родительского элемента. (ещё не оттестировано).
- Возможность задавать элементу уникальные атрибуты ID (нужен для кнопок) и name (для удобства). По этим атрибутам можно искать элементы: Button* button = win.getByName("TestButton"); , Button* button = win.getById(15).. Поиск по всем элементам (включая дочерние): Button* button = win.getByName("TestButton", true); , Button* button = win.getById(15, true). Искать можно не только в окне, но и в других элементах. (не доделано)
- Новая система событий для элементов

Posted: Tue May 05, 2015 9:48 pm
by punk_joker
Проблема с box_lib не решена еще?

Re: Создание приложений на классах

Posted: Tue May 05, 2015 10:00 pm
by Nikolai1
Проблема с box_lib не решена еще?
Пока нет, к сожалению. Сейчас только разобрался с компилятором, буду пробовать. Надеюсь, на этот раз получится

Re: Создание приложений на классах

Posted: Sun May 10, 2015 9:31 pm
by Nikolai1
https://github.com/npaukov/guik/
Новая версия на GitHub, правда сейчас есть всего 3 элемента интерфейса((( но буду постепенно новые добавлять.

В архиве есть исходный код фреймворка, скомпилированное приложение, пара статей в формате chm.

Re: Создание приложений на классах

Posted: Fri Oct 09, 2015 11:03 pm
by paulcodeman
Nikolai1 wrote:https://github.com/npaukov/guik/
Новая версия на GitHub, правда сейчас есть всего 3 элемента интерфейса((( но буду постепенно новые добавлять.

В архиве есть исходный код фреймворка, скомпилированное приложение, пара статей в формате chm.
Делал еще что нибудь или забросил? :)

Re: Создание приложений на классах

Posted: Sat Oct 10, 2015 3:40 pm
by Nikolai1
Пока так сложились обстоятельства, что забросил... Но это пока