Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Сб окт 21, 2017 7:52 am

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 74 сообщения ]  На страницу 1 2 3 4 5 След.
Автор Сообщение
 Заголовок сообщения: Создание приложений на классах
СообщениеДобавлено: Пт ноя 07, 2014 5:54 pm 
Не в сети

Зарегистрирован: Сб окт 11, 2014 6:06 pm
Сообщения: 67
Решил попробовать представить основные элементы интерфейса как классы (пока есть только окно, надпись и кнопка). Целью было облегчить создание программ под KolibriOS и сделать проще обработку событий (клик по кнопке например).

Для теста создал окно с надписью и кнопкой. При клике по кнопке меняется текст и цвет надписи и фон кнопки.
Код получился вот такой:
Спойлер: Показать
Код:
#include <kosSyst.h>
#include <kosFile.h>
#include "core.h"

// Заголовок окна
const char header[] = "HelloWorld test";
// Регистрация окна
Window* win = new Window();

// Обработка клика по кнопке
void buttonclick(Button* btn) {
   win->labels[0]->color = COLOR_BLUE;
   win->labels[0]->text = "Click!!!";

   btn->color = COLOR_YELLOW;

   win->update();
}

void exitButtonClick(Button* btn) {
   kos_ExitApp();
}

void kos_Main() {
   win->header = (Dword)"Window";

   // Кнопка
   Button* btn = new Button;
   btn->x = 10;
   btn->y = 10;
   btn->sizeX = 30;
   btn->sizeY = 10;
   btn->id = 0;
   btn->color = COLOR_RED;
   btn->onclick = buttonclick;

   // Ещё кнопка
   Button* exitBtn = new Button;
   exitBtn->hidden = true;
   exitBtn->id = 1;
   exitBtn->onclick = exitButtonClick;

   // Надпись
   Label* lbl = new Label;
   lbl->x = 10;
   lbl->y = 50;
   lbl->id = 0;
   lbl->text = "Hello";

   // Регистрация элементов интерфейса в окне
   win->addControl(CONTROL_BUTTON, btn);
   win->addControl(CONTROL_BUTTON, exitBtn);
   win->addControl(CONTROL_LABEL, lbl);

   // Отрисовать окно
   win->draw();
   // Запустить обработку событий
   win->waitForEvent();
}


Прикрепил архив с получившимся приложением и код классов.
Как думаете, есть у моей разработки какие-нибудь перспективы?

P. S. C++ я только начинаю изучать, поэтому некоторые вещи могут быть сделаны очень "Криво"


Вложения:
test.zip [3.82 КБ]
78 скачиваний

_________________
Чудеса случаются! Это вам любой программист скажет! :)
Вернуться к началу
 Заголовок сообщения: Re: Создание приложений на классах
СообщениеДобавлено: Пт ноя 07, 2014 7:28 pm 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4220
Идея хорошая, надо и нам в С-- такие штуки сделать.

_________________
Через тернии к звездам


Вернуться к началу
 Заголовок сообщения: Re: Создание приложений на классах
СообщениеДобавлено: Пт ноя 07, 2014 7:31 pm 
Не в сети

Зарегистрирован: Ср май 18, 2005 7:27 pm
Сообщения: 1001
Это в каком компиляторе сделано - Microsoft Visual Studio или что-то другое?


Вернуться к началу
 Заголовок сообщения: Re: Создание приложений на классах
СообщениеДобавлено: Пт ноя 07, 2014 7:38 pm 
Не в сети

Зарегистрирован: Сб окт 11, 2014 6:06 pm
Сообщения: 67
Microsoft Visual C++ 2010 Express Edition

_________________
Чудеса случаются! Это вам любой программист скажет! :)


Вернуться к началу
 Заголовок сообщения: Re: Создание приложений на классах
СообщениеДобавлено: Пт ноя 07, 2014 9:42 pm 
Не в сети

Зарегистрирован: Сб окт 11, 2014 6:06 pm
Сообщения: 67
Никто не подскажет, как в одном массиве хранить указатели на объекты разных классов? Во всех примерах, которые я находил используется std::vector.

_________________
Чудеса случаются! Это вам любой программист скажет! :)


Вернуться к началу
 Заголовок сообщения: Re: Создание приложений на классах
СообщениеДобавлено: Сб ноя 08, 2014 5:18 am 
Не в сети
Mentor
Аватара пользователя

Зарегистрирован: Пн окт 19, 2009 10:58 am
Сообщения: 329
Делай абстрактный класс и наследуй от него.


Вернуться к началу
 Заголовок сообщения: Re: Создание приложений на классах
СообщениеДобавлено: Вт ноя 11, 2014 12:25 am 
Не в сети

Зарегистрирован: Сб окт 11, 2014 6:06 pm
Сообщения: 67
Подскажите, что делать в такой ситуации:
есть адрес указателя на функцию, как по нему вызвать функцию?

Код:
void Event::call(int action) {
   if (actions[action] == NULL) return;
   int i;
   void (*hnd)();// Указатель

   for (i=1;i<5;i++) {
      hnd = actions[action]->handlers.Peek(i); // actions[action]->handlers - стек
       // В hnd заносится адрес указателя на функцию
      if (hnd != NULL) hnd(); // Программа закрывается на этом месте, если эту строку убрать - то не закрывается
    }
}


я использовал класс стека отсюда http://cppstudio.com/post/5155/
Пробовал по всякому, не работает
Если получится, будет как мне кажется красивый и удобный способ устанавливать обработчики для событий элементов:
Код:
// Обработка клика по кнопке
void buttonclick() {
   win->buttons[win->clickButtonId]->color = COLOR_YELLOW;
   win->update();
}

// Ещё действие при клике
void buttonclick2() {
   win->labels[0]->color = COLOR_BLUE;
   win->labels[0]->text = "Click!!!";
}

Button* btn = new Button;
btn->addHandler(EVENT_BUTTON_CLICK, buttonclick);
btn->addHandler(EVENT_BUTTON_CLICK, buttonclick2);

// Ещё примеры
Window* win = new Window();
win->addHandler(EVENT_DRAW, testhandler);

// Событие вызывается так (будут выполнены все обработчики):
win->call(EVENT_DRAW);

_________________
Чудеса случаются! Это вам любой программист скажет! :)


Вернуться к началу
 Заголовок сообщения: Re: Создание приложений на классах
СообщениеДобавлено: Вт ноя 11, 2014 9:13 am 
Не в сети

Зарегистрирован: Ср сен 24, 2014 5:47 pm
Сообщения: 34
Leency писал(а):
Идея хорошая
Идея очевидная :) А делать надо один раз - сам API системы, вместо библиотек оберток-прокладок под десяток языков.


Вернуться к началу
 Заголовок сообщения: Re: Создание приложений на классах
СообщениеДобавлено: Вт ноя 11, 2014 9:20 am 
Не в сети

Зарегистрирован: Ср сен 24, 2014 5:47 pm
Сообщения: 34
Nikolai1 писал(а):
есть адрес указателя на функцию

Это как, указатель на указатель? :)
Да, сравнивать с NULL совершенно излишне. Вместо
Код:
if (some_expr!=0)
if (some_expr==0)

достаточно
Код:
if (some_expr)
if (!some_expr)


Последний раз редактировалось irkant Вт ноя 11, 2014 12:46 pm, всего редактировалось 1 раз.

Вернуться к началу
 Заголовок сообщения: Re: Создание приложений на классах
СообщениеДобавлено: Вт ноя 11, 2014 12:42 pm 
Не в сети

Зарегистрирован: Сб окт 11, 2014 6:06 pm
Сообщения: 67
Убрал стек и сделал хранение обработчиков через массив указателей на функции.
Для тестирования работы сделал простенькую программку, в которой можно управлять кнопкой.
Управление:
W - вверх
S - вниз
D - вправо
A - влево
Клик по кнопке вернёт её в начальное положение

Код:
// Обработка клика по кнопке
void buttonclick() {
   win->buttons[0]->x = 20;
   win->buttons[0]->y = 20;

   win->update();
}

void window_key_press() {
   switch (win->lastKeyPressCode) {
      //..........................
   }

   char a = static_cast<char>(win->lastKeyPressCode);
   win->labels[0]->text = &a;
   win->update();
}

// ........
btn->addHandler(EVENT_BUTTON_CLICK, buttonclick);
win->addHandler(EVENT_KEY_PRESS, window_key_press);
// ..............


Вложения:
test0.0.2.zip [5.74 КБ]
88 скачиваний

_________________
Чудеса случаются! Это вам любой программист скажет! :)
Вернуться к началу
 Заголовок сообщения: Re: Создание приложений на классах
СообщениеДобавлено: Вт ноя 11, 2014 3:40 pm 
Не в сети

Зарегистрирован: Сб окт 11, 2014 6:06 pm
Сообщения: 67
Теперь хочу добавить другие элементы интерфейса - поле для ввода текста, флажки и т.д.. Буду пытаться понять принцип подключения box_lib из приложения table :lol:
А ещё нужно как-то поправить хранение этих элементов в классе, для каждого типа элемента (кнопка, надпись) сейчас создан отдельный массив указателей и переменная (хранит номер последнего элемента в массиве)

Как думаете, что ещё можно добавить?

Если смогу, то как мне кажется, можно будет использовать мои классы как библиотеку для облегчения разработки.

_________________
Чудеса случаются! Это вам любой программист скажет! :)


Вернуться к началу
 Заголовок сообщения: Re: Создание приложений на классах
СообщениеДобавлено: Ср ноя 12, 2014 9:50 pm 
Не в сети

Зарегистрирован: Сб окт 11, 2014 6:06 pm
Сообщения: 67
Без кучи готовых библиотек (которые есть под Windows) трудно нормально программировать :(

_________________
Чудеса случаются! Это вам любой программист скажет! :)


Вернуться к началу
 Заголовок сообщения: Re: Создание приложений на классах
СообщениеДобавлено: Ср ноя 12, 2014 10:58 pm 
Не в сети

Зарегистрирован: Вт апр 12, 2011 11:19 pm
Сообщения: 1076
Nikolai1 писал(а):
Без кучи готовых библиотек (которые есть под Windows) трудно нормально программировать :(

Нормальных, это каких?

_________________
я лишь учусь


Вернуться к началу
 Заголовок сообщения: Re: Создание приложений на классах
СообщениеДобавлено: Чт ноя 13, 2014 3:52 pm 
Не в сети

Зарегистрирован: Сб окт 11, 2014 6:06 pm
Сообщения: 67
Цитата:
Нормальных, это каких?

Например хотелось бы использовать контейнеры vector и map. Они есть под Kolibri?

P. S. Как я писал ранее, в C++ я новичок, изучаю около месяца (и то не каждый день) в свободное время. Может для моих целей можно использовать что-нибудь другое

_________________
Чудеса случаются! Это вам любой программист скажет! :)


Вернуться к началу
 Заголовок сообщения: Re: Создание приложений на классах
СообщениеДобавлено: Чт ноя 13, 2014 4:16 pm 
Не в сети
Kernel Developer

Зарегистрирован: Вс фев 10, 2013 12:37 pm
Сообщения: 2329
Nikolai1 писал(а):
P. S. Как я писал ранее, в C++ я новичок, изучаю около месяца (и то не каждый день) в свободное время. Может для моих целей можно использовать что-нибудь другое

Можно. Лучший язык программирования в Колибри для новичков это Assembler++.

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 74 сообщения ]  На страницу 1 2 3 4 5 След.

Часовой пояс: UTC+03:00


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

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


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

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB