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
Я только учусь)))
а под 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();
}
В ближайшее время собираюсь выложить, я вроде тестирую, но хотелось бы, чтобы потестировали другие программисты
Для этого постараюсь составить небольшую документацию и выложу примеры использования с комментариями
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
Пока так сложились обстоятельства, что забросил... Но это пока