Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Хостинг Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг на Windows 2008

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 1128
от 10.10.2008, 07:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 424, Экспертов: 42
В номере:Вопросов: 2, Ответов: 2

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>


Вопрос № 145972: Здравствуйте, уважаемые эксперты. Как описать в C++ класс графических объектов-кнопок(которых должно быть 6 на экране) при щелчке на одной из них вызывается функция с параметром разным для каждой кнопки? Ну и чтобы надписи на них были разными. Также ...
Вопрос № 145975: Здравствуйте, помогите пожалуста решить след. задачи и отладить или решить заново задачу в приложении: 4. Вроде всё правильно, но глючит. см. приложение. 5. Задана матрица A(n,m), упорядоченная по возрастанию построкам и столбцам, то есть A...

Вопрос № 145.972
Здравствуйте, уважаемые эксперты. Как описать в C++ класс графических объектов-кнопок(которых должно быть 6 на экране) при щелчке на одной из них вызывается функция с параметром разным для каждой кнопки? Ну и чтобы надписи на них были разными. Также нужен еще один большой графический элемент, на котором бы изменялся текст в ходе работы программы, размеры его должны автоматически подгоняться под размеры ее окна.Соотвественно и объем бы текста выведенного на нем должен подстраиваться под размер. Я очень просил бы написать примерный код размещающий все это хозяйство на экране, поскольку в области графики не очень силен и имел опыт работы в основном с консольными приложениях. Спасибо.
Отправлен: 04.10.2008, 15:16
Вопрос задал: Alexg (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Dr_Andrew
Здравствуйте, Alexg!
К сожалению, в своём вопросе Вы не указали операционную систему, под которой работаете, и предпочитаемую среду разработки. Поэтому привожу решение для Linux (пример №1 в приложении), компилятор g++ 4.1, библиотека Qt 3.3.8 (впрочем, под Windows пример №1 можно откомпилировать с использованием MS Visual C++ 6 и библиотеки Qt 3.2.1) и для Windows (пример №2 в приложении), среда разработки Borland C++ Builder или Turbo C++ Explorer.
Разберём Вашу задачу на следующем примере. Предположим, что у нас есть 6 кнопок класса TButton с открытым (public) свойством уникального идентификатора - тега (Tag). При нажатии на ту или иную кнопку выводится сообщение с номером её тега. Кроме того, это сообщение дублируется на ярлыке (label), находящемся под группой кнопок, расположенных в 3 колонках в 2 ряда. Размер ярлыка автоматически подстраивается под размеры текста.
Пример 1.
Объявим класс TButton, унаследовав его от Qt-класса QPushButton. В качестве открытого свойства класса объявим строковую переменную QString sTag; Объявим также слот, который будет вызываться при щелчке на кнопке - void ClickedSlot(); Кроме того, объявим сигнал, который будет посылать тег кнопки, при щелчке на ней: void clicked(QString&);
В реализации класса установим соединение между щелчком по кнопке и вызовом слота ClickedSlot(): connect(this, SIGNAL(clicked()), this, SLOT(ClickedSlot()));
Слот будет генерировать сигнал, посылающий тег кнопки: emit clicked(sTag);
В классе центрального виджета TCentralWidget разместим виджеты кнопок (класс TButton) и ялыка для вывода текста (QLabel* pTextLabel) с помощью менеджеров компоновки (layouts), которые обеспечивают аккуратное размещение виджетов на форме приложения, а также подстраивание их размеров под размеры текста.
Логика приложения реализована в слоте ButtonClickedSlot(QString&) центрального виджета, в который в качестве параметра передаётся тег вызвавшей кнопки:
Код:

void TCentralWidget::ButtonClickedSlot(QString& sTag)
{
QString sMessage = trUtf8("Нажата кнопка номер ") + sTag;
QMessageBox::information(this, "Buttons", sMessage); // Сообщение с тегом кнопки

sMessage = "<p align=Center>" + trUtf8("Последней была нажата кнопка номер ") + sTag + "</p>";
pTextLabel->setText(sMessage); // Сообщение на ярлыке
}

Пример 2.
Установим свойство Caption сгенерированной формы приложения в "Кнопки", а Name - в MainForm. Разместим на форме 6 кнопок класса TButton в 3 колонках в 2 ряда. Поскольку в Borland C++ Builder / Turbo C++ Explorer не имеет менеджеров компоновки, то кнопки придётся выравнивать на форме по линиям сетки вручную, либо воспользовавшись командой контекстного меню Align...
Внизу разместим ярлык класса TLabel. Установим свойство Caption ярлыка в "Нажмите кнопку", AutoSize и WordWrap в true, что обеспечит подстраивание размера ярлыка под размер текста.
Класс TButton Билдера уже содержит свойство Tag, являющееся целочисленной переменной. Установим свойство Tag первой кнопки в 1, второй - в 2 и т.п.
Логику приложения реализуем в обработчике события щелчка по первой кнопке:
Код:

void __fastcall TMainForm::Button1Click(TObject *Sender)
{
TButton* pButton = (TButton*)Sender;
AnsiString sTag = IntToStr(pButton->Tag); // Преобразуем целочисленную переменную в строку
AnsiString sMessage = "Нажата кнопка номер &quo t; + sTag;
ShowMessage(sMessage); // Сообщение с тегом кнопки
sMessage = "Последней была нажата кнопка номер " + sTag;
TextLabel->Caption = sMessage; // Сообщение на ярлыке
}

В качестве аргумента обработчик события принимает компонент, вызвавший событие - щелчок по кнопке: TObject *Sender
Объявим переменную-указатель на объект класса TButton и присвоим ему адрес объекта, вызвавшего щелчок по кнопке:
TButton* pButton = (TButton*)Sender;
После чего мы можем в функции-обработчике вызывать то или иное действие в зависимости от тега кнопки.
Для того, чтобы обработчик Button1Click вызывался при щелчке по любой кнопке, установим Events для каждой из 6 кнопок по событию OnClick в Button1Click.
P.S. Также группу кнопок можно было реализовать в виде массива указателей на объекты, что разумно в случае их большого количества.

Приложение:

Ответ отправил: Dr_Andrew (статус: Студент)
Ответ отправлен: 05.10.2008, 10:23
Оценка за ответ: 5
Комментарий оценки:
Спасибо за столь оперативный и полный ответ!


Вопрос № 145.975
Здравствуйте, помогите пожалуста решить след. задачи и отладить или решить заново задачу в приложении:
4. Вроде всё правильно, но глючит. см. приложение.
5. Задана матрица A(n,m), упорядоченная по возрастанию построкам и столбцам, то есть
A(i,1)<=A(i,2)<=...<=A(i,m), для любого i
A(1,j)<=A(2,j)<=...<=A(n,j), для любого j
6. Даны 2 целочисл. таблицы A(10) и B(15). Разработать алгоритм и написать программу, которая проверяет,
являются ли эти таблицы похожими. 2 таблицы будем называть похожими, если совпадают множества чисел,
встречающихся в этих таблицах.
PS: все задачи на тему "Сложность и эффективность алгоритмов. Поиск и сортировка информации", нумеровка
как в списке задач.

Приложение:

Отправлен: 04.10.2008, 15:36
Вопрос задал: Piotr-1 (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 6)

Отвечает: Владимир (C4tnt)
Здравствуйте, Piotr-1!

4. Если у вас список монет сортированый - то ищите эталон двоичным или троичным поиском, более быстрый алгоритм довольно сложно придумать. А на несортированные списки быстрый поиск вообще не распространяется - ищите перебором.

5. Вопрос так и не задали...

6. Если таблицы не сортированы - берём первое число в B, удаляем из B все его вхождения, удаляем из A все его вхождения, если из А ничего удалено не было - значит списки не похожи. Если B пустой, а A - нет, значит списки не похожи.

---------
Теперь к нашим ответам осталось лишь найти вопросы
Ответ отправил: Владимир (C4tnt) (статус: 5-ый класс)
Ответ отправлен: 04.10.2008, 20:24
Оценка за ответ: 4
Комментарий оценки:
за 6 вопрос спасибо. Насчет зад. 4 и 5 см. минифорум - дополнения к условию.
ЗЫ: 4-я задача не такая простая - опять же, в минифоруме.


Вы имеете возможность оценить этот выпуск рассылки.
Нам очень важно Ваше мнение!
Оценить этот выпуск рассылки >>

Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

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

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2008, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале

∙ Версия системы: 5.5 от 09.10.2008

Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное