Jump to content
artos5

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

Recommended Posts

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

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

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

Алгоритм:

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

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

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

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

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

Как читать данные с 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" ;
}
//---------------------------------------------------------------------------

Edited by artos5

Share this post


Link to post
Share on other sites

Привет.

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

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

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

Edited by hd44780

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

Литиевые батарейки Fanso для систем телеметрии и дистанционного контроля

Системы телеметрии находят все более широкое применение во многих отраслях на промышленных и коммунальных объектах. Требования, предъявляемые к условиям эксплуатации приборов телеметрии и, как следствие, источников питания для них, могут быть довольно жесткими. Fanso предоставляет широкую линейку продукции, рассчитанной на различные условия эксплуатации, что позволяет подобрать батарейку для каждого конкретного применения, в том числе и для устройств телеметрии.

Подробнее

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

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

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

Привет.

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

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

Edited by artos5

Share this post


Link to post
Share on other sites

Допустим есть поле 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

Share this post


Link to post
Share on other sites
                     

Материалы вебинара STM32G0 – новый лидер бюджетных 32-битных микроконтроллеров от STMicroelectronics

На вебинаре были продемонстрированы современные методы тестирования производительности микроконтроллеров на примере самых бюджетных 32-битных семейств общего назначения STM32G0 и STM32F0, проведено их подробное сравнение. Мы подготовили для вас материалы. Вы можете посмотреть видеозапись вебинара, ознакомиться с ответами на вопросы, загрузить код для тестирования, прочитать статьи по теме

Подробнее...

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

post-59941-0-52336300-1354012300.gif

Edited by artos5

Share this post


Link to post
Share on other sites

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

Создаёте проект что-то типа "приложение 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 для метки.

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

Edited by Diversant

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

Edited by hd44780

Share this post


Link to post
Share on other sites

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

Да, знаю :)

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

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Edited by hd44780

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

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

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

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

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

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

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

Edited by hd44780

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

Edited by hd44780

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

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

Edited by hd44780

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

Допустим есть поле 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

Edited by artos5

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • На нём написан максимальный ток заряда, а выдавать на разряд он может и побольше, особенно, если его закоротить, что ты и сделал. 
    • Как всегда, всё вытягивать надо. В час по чайной ложке. Исходную схему с PICом покажите. И функционал опишите: что и как делает схема, какие параметры контролирует и т.п. и т.д. Тогда и можно будет что то посоветовать. А пока, как выше и сказали, даже тиньки 2313 может хватить. Кст, программу тоже будете писать? Программа для PIC и Atmega - это две большие разницы.
    • Только так - брать с собой в магазин и примерять. Ибо ни марок, ни посадочных размеров никто не знает, в т.ч. и продавец в магазине.
    • Все, кто ставил себе предпусковые подогреватели знает, что нужна небольшая помпа для циркуляции антифриза, лучше бесщеточный.  Зарядник подключить навсегда к АКБ через диод Шоттки, чтобы аккум не разряжался через него.  Чтобы вентилятор подключить напрямую к АКБ без включения зажигания, нужно перехватывать релюшкой два провода, так один идет на зажигание, а второй на ШИМ регулятор или набор добавочных резисторов. 
    • Причин может быть туча. Если не получилось вылечить монитор с наскока, то надо уже бросить "ковровую бомбардировку" и подойти к решению задачи как и рекомендует форум, например, прикрепить схему, чтобы можно было хоть что то посоветовать.  
    • Согласно формулам расчёт фи для альфы даёт Vb=2373,54л, Fз=Fb=13.1гц, Dv=15см, Lv=1.82см. Т.е двухкубовый с лишним ящик с трубой инвертора диаметром 15см, длинной 1.8см с настройкой резонанса по уровню -3дб на 13.1гц.  Просчитаем рекомендованный зя 85л. Резонанка в таком ящике Fc= 41×sqrt (1+260/85)=82.6 Добротность резонанки Qtc=1.26×sqrt(1+260/85)=2.538.  Такая добротность даст очень заметный на слух выброс ачх 20log(2.538)=8дб т.е будет бубнить на частоте 82.6гц. Рекомендованый фи 177л будет бунякать ещё хлеще. В итоге после таких вот "рекомендаций горе-рекомендаторов" соблюдателям подобных рекомендаций, в том чисое и вам, не нравится звучание зя/фи.  Что касаемо моих наработок в моей теме. Во первых, тема есть, но на другом форуме. И свои изделия показывал в соответствующей теме. Во вторых, я не нуждаюсь а оценке своего труда в соц.сетях. И главное- не пиарю свои наработки с целью окучивания лохов. В отличии от доски с шириками, мои SG скопировать и повторить невозможно. Как повторить изделия Adamson, L-Acoustics, WisdomAudio, GemmeAudio, Bosendorfer и многих других.
  • Покупай!

×
×
  • Create New...