Перейти к содержанию

Borland C++ Простейшие Задачи (Опрос Кнопок , Ввод/вывод Данных)


Рекомендуемые сообщения

Добрый день дорогие друзья! Помогите пожалуйста "стартонуть" в этой области программирования.

До этого несколько лет пишу на Си для микроконтроллеров. В общих чертах Си++ не вызывает проблем и удивления у меня. :)

Вот сегодня решил попробовать решить простейшую задачу.

Алгоритм:

опрос кнопок и вывод данных (текста) в определенной области окна приложения.

Но возникли трудности...

Данные не отображаются.

Что хотелось бы узнать (уверен что не одному мне)

Как выводить текст при нажатии кнопки?

Как читать данные с COM порта по RS232 и выполнять действия?

Как получать данные (клавиатура , COM порт) и их записывать в файл, например .TXT

Думаю эта тема будет интересна многим начинающим программистам!

Вот пример того что я пытаюсь сделать:

//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream>
#pragma hdrstop
using namespace std;
int z,y,x;
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
 : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
z=1; y=1; x=0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
z=1; y=0; x=1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
z=0; y=1; x=1;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Panel1Click(TObject *Sender)
{
if(x==0) cout << "Привет! нажата кнопка 1" ;
if(y==0) cout << "Привет! нажата кнопка 2" ;
if(z==0) cout << "Привет! нажата кнопка 3" ;
}
//---------------------------------------------------------------------------

Изменено пользователем artos5

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Привет.

Прога ваша не на VC++, но попытаюсь в общих чертах обрисовать...

1. Приложение у Вас явно не консольное. Значит, "просто так" Вы cout не увидите. Тут 2 варианта - запустить прогу с переназначением в файл. 1.exe > out.txt. В файле поимеете ваш cout .... Но если делать "по-нормальному", то Вам надо вешать обработчик на событие WM_KEYPRESSED (если не ошибся :) ) и там аргументом придёт код символа. Плюс тонкости с фокусом ввода. Если, например, на форме есть textbox и у него фокус ввода, то WM_KEYPRESSED придёт ему, а не форме .....

2. Имена обработчиков ...Click наталкивают меня на мысль, что это вообще не клавиатура, а мыша ... Я прав или нет?

Изменено пользователем hd44780
Ссылка на комментарий
Поделиться на другие сайты

В программировании под ОС Windows главный справочник - MSDN.

Для работы с файлами и COM-портом - CreateFile,WriteFile,ReadFile.

Обработка нажатий клавиш... применительно к указанной среде разработки - есть обработчик события onkeypress, onkeydown, onkeyup.

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

По приведённому Вами коду:

if(x==0) cout << "Привет! нажата кнопка 1" ;
if(y==0) cout << "Привет! нажата кнопка 2" ;
if(z==0) cout << "Привет! нажата кнопка 3" ;

Так выводится строка на печать в консольном приложении.

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

А есть простой пример кода на Си++ чтоб вывести текст или переменную?

Вот на картинке я отобразил :)

И как пользоваться командами чтения/записи COM порта ? Я так понимаю надо библиотеку подключать? Тогда какую?

Привет.

Привет! Не ожидал Тебя тут увидеть :)

post-59941-0-90986800-1354010628_thumb.gif

Изменено пользователем artos5

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Допустим есть поле Edit1 и кнопки Button1, Button2, Button3

// вывод строки
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Edit1->text = "Hello";
}

// очистка поля ввода
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Edit1->text = "";
}

// вывод переменной
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Edit1->text = IntToStr(x);
}

А для чтения/записи COM-порта вызываются функции (приводил выше).

Можно, например, здесь почитать:

http://multitest.semico.ru/mtext1.htm

http://softelectro.ru/rs232prog.html#M30

http://articles.org.ru/cfaq/index.php?qid=2468&catid=48

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Какой из этих компонентов выбрать чтоб вывести текст или переменную туда. И где надо прописать вывод текста/переменной? В функции Button или в той что является окном для отображения данных?

post-59941-0-52336300-1354012300.gif

Изменено пользователем artos5

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Попробую объяснить пошагово...

Создаёте проект что-то типа "приложение Windows" должно быть. Появится главное окно будущего приложения. Ставите на него контрол Edit (возможно подписан как "text", у меня нет Borland C++, негде проверить). Добавляете три кнопки. На одной из них делаете двойной щелчёк - открывается окно редактора кода с функцией обработки нажатия кнопки

void __fastcall TForm1::Button1Click(TObject *Sender)
{

}

в промежутке между фигурными скобками пишете Edit1->Text = "this is string";

Или можно вместо Edit поставить Label и вписать Label1->Caption = "This is string";

Когда после Edit или Label вводите -> должен появиться список свойств. там можно выбрать текст для эдит или caption для метки.

Сохранить, запустить... проверить.

Изменено пользователем Diversant
Ссылка на комментарий
Поделиться на другие сайты

Не ожидал Тебя тут увидеть :)

Да работаю я программистом - .NET, C#, c++. Ну и там, что ещё начальство повесит ...

А контроллеры и прочее железо - просто хобби. Для себя :) .

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

Тот, где большая буква A. Это Label. Остальное - Diversant нормально написал.

А про sprintf, я думаю, ты знаешь. Она такая же, как и в МК ....

Изменено пользователем hd44780
Ссылка на комментарий
Поделиться на другие сайты

> А про sprintf, я думаю, ты знаеш.

Да, знаю :)

А проще нету выражения?

Например как в консоле:

cout << data_byte << "переменная";

Спасибо за подсказки! Прописал, скомпилировал, запустил, Работает! : )))

Теперь еще вопрос:

Где прописывать чтобы "алгоритм крутился" как в бесконечном цикле и выполнял какие то действия. И что то переодически отображал на экране .?

К примеру я получаю данные с COM порта обрабатываю их и вываливаю на экран.

Спасибо за ссылки! Если бы было возможным поставить больше одного спасибо, я-бы Вам поставил 2-ва спасибо :)

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

А проще нету выражения?

Например как в консоле:

cout << data_byte << "переменная";

Потоковых операций я не знаю. Вроде можно организовать поток в памяти, писать в него, потом забирать буфер .. Но, как по мне, это аппендицит через всем известное место вырезать ...

Ещё есть функции типа itoa, ltoa - одну переменную в строку. Хотя, я всегда пишу sprintf :) .

Где прописывать чтобы "алгоритм крутился" как в бесконечном цикле и выполнял какие то действия. И что то переодически отображал на экране .?

К примеру я получаю данные с COM порта обрабатываю их и вываливаю на экран.

Про бесконечные циклы забудь. Они применяются только в потоках, хотя и там они не бесконечные ... Тебе, похоже рановато в это лезть :) .

Если ты в какой-то кнопке сделаешь вечный цикл, ты банально "повесишь" прогу. У тебя даже твоя форма обновляться не будет без спец ухищрений типа принудительного Reresh-a ...

Бесконечного здесь вообще ничего никогда быть не должно.

Считай, что бесконечный цикл уже реализован где-то глубоко в недрах винды (точнее стандартных библиотек) и он иногда вызывает твои функции, типа "клик мыши по кнопке". Я могу это разжевать, если хочешь... Или поискать, где почитать об этом.

Этот цикл называется "цикл обработки собщений". Всё построено на сообщениях.

Все операции выполняются по событиям. Для COM-порта тоже есть событие прихода данных. Как прерывание в МК.

Можно ещё сделать таймер, он будет вызывать твой обработчик с определённым интервалом и проверяй там буфер порта, есть там что-то или нет.

Посмотри, может в твоём билдере есть готовые компоненты для этого. Чтобы не влезать с руками и ногами в WinApi для работы с портом ....

Изменено пользователем hd44780
Ссылка на комментарий
Поделиться на другие сайты

Про бесконечные циклы забудь

Вот я это понимаю :)

Просто все повиснет.

Для COM-порта тоже есть событие прихода данных. Как прерывание в МК.

Я так и догадывался. Но как это связать.... ума пока не приложу :)

В МК это все просто :)

А что можно делать с GroupBox - ом ?

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Я так и догадывался. Но как это связать.... ума пока не приложу :)

В МК это все просто :)

Дело привычки. Я начинал на MS-DOS, там тоже всё на вечном цикле и опроса клавиатуры и прочего по сути построено...

Прерывания тоже были, но мало :) ...

Когда винда пошла, немало времени прошло, пока проникся этой парадигмой событийной модели программирования :) .

Насчёт COM-порта - поищи в инете.

Просто я делал это на VC++, а с билдером дел не имел. Поэтому рассказывать не хочу, только запутаю тебя ....

А что можно делать с GroupBox - ом ?

Да ничего. Просто рамка. Для визуального выделения логически связанных контролов...

Единственный случай (по моему :) ), где она на что-то влияет - Radiobuttons.

Проведи эксперимент - накидай на форму 2-3 radiobuttons. Тупо накидай, безо всего остального - без обработчиков, кода какого-то ...

Потом накидай их в GroupBox.

Запусти и сравни их поведение :) .

Изменено пользователем hd44780
Ссылка на комментарий
Поделиться на другие сайты

Да ничего. Просто рамка. Для визуального выделения логически связанных контролов...

Единственный случай (по моему :) ), где она на что-то влияет - Radiobuttons.

Проведи эксперимент - накидай на форму 2-3 radiobuttons. Тупо накидай, безо всего остального - без обработчиков, кода какого-то ...

Потом накидай их в GroupBox.

Запусти и сравни их поведение :) .

Что то не совсем вкурил я... GroupBox

Я понимаю как: "Группа бокса" или "Группа в боксе"

То есть куча каких то функций в этой рамке..

Так, radiobutton я понял что это. Это как переключатель :)

Но я попробовал тупо накидать "radio кнопок" в groupbox . И ничего не работает... просто рамка болтается groupbox - a

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Еще вопросик..

Что надо выбрать чтобы с клавы читать данные и потом их отображать? И как создать простой таймер? Чтобы он "тикал".

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

"Читать данные" - стандартный контрол TextBox

Таймер - фукция SetTimer в WinAPI - http://msdn.microsof...6(v=vs.85).aspx

Может в борланде что-то готовое (в смысле некий "облегчённый вариант") есть ..

Изменено пользователем hd44780
Ссылка на комментарий
Поделиться на другие сайты

Путем насилования "гугля" понял (в общих чертах) как работает приложение в ОС Windows.

Приложение как прерывание. В котором каждое событие тоже как мини-прерывание, которое необходимо контролировать.

Правильно ли я понимаю?

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

В главной функции приложения есть такой цикл (привожу упрощённо, без обработки ошибок):

while (GetMessage(&msg, 0, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

Называется циклом обработки сообщений. Он выполняется на протяжении всего времени работы приложения. Такой конвеер: приём сообщения (нажатие клавиши, мышь над окном двинули, кликнули, окно передвинули и т.д. и т.п.), обработка, посылка в функцию окна. А в функции окна уже может быть описан обработчик этого сообщения. В средах разработки от Borland этот код скрыт для упрощения. Пишутся сразу обработчкики сообщений. Хотя есть возможность и написания приложения "с нуля".

По поводу таймера, либо функция api как посоветовал hd44780, либо готовый компонент должен быть, так и называется Timer. Посмотрите вкладки компонентов, либо Advanced либо System...

Ссылка на комментарий
Поделиться на другие сайты

Допустим есть поле Edit1 и кнопки Button1, Button2, Button3


// вывод переменной
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Edit1->text = IntToStr(x);
}

Добрый день Вам! Попробовал Ваш пример вывода переменной. Почему то выдает ошибку. Не можете пояснить что не так?

Буду Вам очень признателен!

Хочу попробовать сделать простейшие часы

Вот код:

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
sek_++;
if(sek_>59)
{
sek_=0;
min_++;
}
if(min_>59)
{
min_=0;
h++;
}
if(h>23)
{
h=0;
min_=0;
sek_=0;
}
Edit1->Text = "sek ; min ; h";
Edit2->text = IntToStr(sek_);
Edit3->text = IntToStr(min_);
Edit4->text = IntToStr(h);
}

post-59941-0-71034700-1354174638_thumb.gif

Изменено пользователем artos5

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...