Консультация № 170597
20.07.2009, 08:46
0.00 руб.
0 18 1
Здраствуйте Уважаемые эксперты. Я не могу разобраться с MS Visual C++ 2008. А точнее с формами. Что мне нужно написать для того чтобы при нажатии на кнопку, которая уже имеется в программе выполнялся вывод текста в форме. где нибудь. например в правом углу экрана. Или же вывод значения переменной. Подключал библиотеку <iostream> и пользовался std::cout компилятор жаловался на эту конструкцию. И я не понимаю как с помощью например ее вывести текст в форму. Помогите пожалуйста. В ссылке код программы.

Приложение:
http://s11.radikal.ru/i184/0907/ca/b891aca63129.jpg

Обсуждение

Неизвестный
20.07.2009, 09:51
общий
cout работает с консолью, причем в обход .Net. Тут вместо него лучше использовать класс Console. Если нужен просто текст на форме, поместите на форму Label в нужное место и меняйте его текст.
Неизвестный
20.07.2009, 09:59
общий
Как сделать чтобы при нажатии на кнопку содержание текста в Label менялось на заданное? И как сделать чтобы вывести значение переменной?
Неизвестный
20.07.2009, 10:07
общий
Например
this->label1->Text="ТЕКСТ";
Так можно присовить текст. А как значение переменной?
Неизвестный
20.07.2009, 10:20
общий
Зависит от типа переменной. Обычно так: Var.ToString() или Var->ToString() соответственно.

А менять - именно так, вроде, и надо. Поставьте это в функцию button1_click
Неизвестный
20.07.2009, 10:27
общий
Не совсем понял. Например у меня есть int k=1;
Как написать строку для ее вывода?
Неизвестный
20.07.2009, 10:33
общий
это ответ
Здравствуйте, Dimon4ik.
Та технология которую Вы используете называется Windows Forms. Это часть более обширной технологии .NET Framework. Стандарт C++ не поддерживает эту технологию. Тот язык на котором Вы программируете это расширение Microsoft называемое C++/CLI. Если Вы решили программировать под .NET то и средства необходимо использовать соответствующие.
std::cout Вам здесь не поможет. Этот потоковый класс предназначен для вывода в стандартный поток вывода. Кроме того смешивать в программе .NET управляемый и неуправляемый(native) код хоть и можно но крайне не желательно. В .NET Framework достаточно средств, чтоб обойтись без этого.
Писать приложения Windows Forms можно как используя дизайнер Visual Studio так и полностью вручную.
Для того, чтоб программа реагировала на нажатие кнопки необходимо создать обработчик события нажатия этой же кнопки. Для этого достаточно клацнуть 2 раза в дизайнере на этой кнопке и после этого наполнить обработчик тем функционалом какой Вам необходим.
Код сгенерированный дизайнером:
Код:

#pragma once


namespace My170597 {

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;

/// <summary>
/// Summary for Form1
///
/// WARNING: If you change the name of this class, you will need to change the
/// 'Resource File Name' property for the managed resource compiler tool
/// associated with all .resx files this class depends on. Otherwise,
/// the designers will not be able to interact properly with localized
/// resources associated with this form.
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
}

protected:
/// <summary>
/// Clean up any resources being used.
/// </summary>
~Form1()
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::Button^ calculateButton;
protected:

protected:

protected:
private: System::Windows::Forms::Label^ resultLabel;

private: System::Windows::Forms::Label^ label1;
private: System::Windows::Forms::Label^ label2;
private: System::Windows::Forms::NumericUpDown^ valueNumericUpDown;
private: System::Windows::Forms::GroupBox^ groupBox1;

private:
/// <summary>
/// Required designer variable.
/// </summary>
System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
void InitializeComponent(void)
{
this->calculateButton = (gcnew System::Windows::Forms::Button());
this->resultLabel = (gcnew System::Windows::Forms::Label());
this->label1 = (gcnew System::Windows::Forms::Label());
this->label2 = (gcnew System::Windows::Forms::Label());
this->valueNumericUpDown = (gcnew System::Windows::Forms::NumericUpDown());
this->groupBox1 = (gcnew System::Windows::Forms::GroupBox());
(cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->valueNumericUpDown))->BeginInit();
this->groupBox1->SuspendLayout();
this->SuspendLayout();
//
// calculateButton
//
// Это сгенерировано для кнопки
this->calculateButton->Location = System::Drawing::Point(85, 71);
this->calculateButton->Name = L"calculateButton";
this->calculateButton->Size = System::Drawing::Size(75, 23);
this->calculateButton->TabIndex = 0;
this->calculateButton->Text = L"Вычислить";
this->calculateButton->UseVisualStyleBackColor = true;

// Регистрация обработчика для события Click
this->calculateButton->Click += gcnew System::EventHandler(this, &Form1::calculateButto_Click);

//
// resultLabel
//
this->resultLabel->BorderStyle = System::Windows::Forms::BorderStyle::Fixed3D;
this->resultLabel->Location = System::Drawing::Point(137, 34);
this->resultLabel->Margin = System::Windows::Forms::Padding(3);
this->resultLabel->Name = L"resultLabel";
this->resultLabel->Size = System::Drawing::Size(100, 23);
this->resultLabel->TabIndex = 1;
this->resultLabel->TextAlign = System::Drawing::ContentAlignment::MiddleLeft;
//
// label1
//
this->label1->AutoSize = true;
this->label1->Location = System::Drawing::Point(8, 14);
this->label1->Name = L"label1";
this->label1->Size = System::Drawing::Size(58, 13);
this->label1->TabIndex = 3;
this->label1->Text = L"Значение:";
//
// label2
//
this->label2->AutoSize = true;
this->label2->Location = System::Drawing::Point(140, 14);
this->label2->Name = L"label2";
this->label2->Size = System::Drawing::Size(62, 13);
this->label2->TabIndex = 4;
this->label2->Text = L"Результат:";
//
// valueNumericUpDown
//
this->valueNumericUpDown->Location = System::Drawing::Point(11, 35);
this->valueNumericUpDown->Name = L"valueNumericUpDown";
this->valueNumericUpDown->Size = System::Drawing::Size(93, 20);
this->valueNumericUpDown->TabIndex = 5;
//
// groupBox1
//
this->groupBox1->Controls->Add(this->calculateButton);
this->groupBox1->Controls->Add(this->valueNumericUpDown);
this->groupBox1->Controls->Add(this->label2);
this->groupBox1->Controls->Add(this->resultLabel);
this->groupBox1->Controls->Add(this->label1);
this->groupBox1->Location = System::Drawing::Point(12, 12);
this->groupBox1->Margin = System::Windows::Forms::Padding(10);
this->groupBox1->Name = L"groupBox1";
this->groupBox1->Size = System::Drawing::Size(245, 100);
this->groupBox1->TabIndex = 6;
this->groupBox1->TabStop = false;
this->groupBox1->Text = L"Sqr(X)";
//
// Form1
//
this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->AutoSize = true;
this->AutoSizeMode = System::Windows::Forms::AutoSizeMode::GrowAndShrink;
this->ClientSize = System::Drawing::Size(269, 123);
this->Controls->Add(this->groupBox1);
this->Name = L"Form1";
this->Text = L"Sqr(X)";
(cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->valueNumericUpDown))->EndInit();
this->groupBox1->ResumeLayout(false);
this->groupBox1->PerformLayout();
this->ResumeLayout(false);

}
#pragma endregion
// Собственно обработчик
private: System::Void calculateButto_Click(System::Object^ sender, System::EventArgs^ e) {
// Пользоваться будем типами .NET, а не native
System::Decimal value=valueNumericUpDown->Value;
resultLabel->Text=(value*value).ToString();
}
};
}
5
Неизвестный
20.07.2009, 10:52
общий
Dimon4ik:
Почитайте что нибудь про .NET Framework
Неизвестный
20.07.2009, 11:09
общий
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
int i=5;
label1->Text=i.ToString();
}
Неизвестный
20.07.2009, 11:18
общий
Dimon4ik:
Использовать C++ с .Net очень неудобно. Я давно уже плюнул на его изучение. В данном случае лучше учить C#. А С и С++ я использую для написания DLL или консольных программ.
Неизвестный
20.07.2009, 13:02
общий
Evgenijm, спасибо большое.
Все понял.
Неизвестный
28.07.2009, 09:57
общий
Visual C# удобнее чем Visual C++?
Неизвестный
28.07.2009, 18:52
общий
Если пользоваться только .Net - тогда гораздо удобнее. При подключении внешних dll C++ тоже больших преимуществ не дает. В С++ можно совмещать код нативный и контролируемый. Если часто нужно совмещать - это может иногда оказаться удобней. Насчет ускорения в таком случае - не уверен.
В C# код гораздо более читаем и понятен. Конструкции языка "подогнаны" для использования некоторых важных интерфесов.
Например, вместо такого ужаса:
for(str_map::const_iterator it_m=my_map.begin();it_m!=my_map.end();++it_m)
там будет что-то типа
foreach(String it_m in my_map)
*Хотя в С++.Net тоже можно написать нечто похожее, хоть и выглядеть будет чуть посложней.

С указателями там работают только если очень хочется, и код по возможности очищен от засилья всяких значков. Типа ->, * и самого раздражающего - ^.
Неизвестный
28.07.2009, 19:03
общий
Спасибо.
Неизвестный
28.07.2009, 19:32
общий
Evgenijm:
Цитата: 268417
Например, вместо такого ужаса:
for(str_map::const_iterator it_m=my_map.begin();it_m!=my_map.end();++it_m)

Что здесь ужасного?
Цитата: 268417
foreach(String it_m in my_map)

Вот так как раз и не будет.
Кстати, в C++/CLI есть оператор for each
Так же скажу, что с дополнением осенью стандартом C++0x эта конструкция(часть которой Вы привели) преобразуется к виду:
Код:

for_each(my_map.begin(),my_map.end(),[](const pair_type& p)
{
wcout<<L"Key:"<<p.first.GetString()<<L"; ";
wcout<<L"Fields:";
for_each(p.second.begin(),p.second.end(),[](const CString& s)
{
wcout<<s.GetString()<<L',';
});
wcout<<"\b "<<endl;
});

Или так:
Код:

for_each(my_map.begin(),my_map.end(),[](const pair_type& p)
{
wcout<<L"Key:"<<p.first.GetString()<<L"; ";
wcout<<L"Fields:";
ostream_iterator<wchar_t*,wchar_t> out(wcout,L",");
transform(p.second.begin(),p.second.end(),out,[](const CString& s)
{
return (wchar_t*)s.GetString();
});
wcout<<"\b "<<endl;
});

Что уже почти как в C#. И это все Native C++.
Впрочем это все как пример.
Цитата: 268417
код по возможности очищен от засилья всяких значков. Типа ->, * и самого раздражающего - ^

Согласен на 100% такое обилие значков в этом диалекте это изврат.
Неизвестный
29.07.2009, 00:22
общий
Да, map - плохой пример для коллекции. Я просто первый попавшийся ответ нашел с похожей структурой. И даже не посмотрел, что там было определено.
Если такое каждый день писать, то привычка вырабатывается, и ничего страшного нет. Я же с этим сталкиваюсь не по своей воле - при совместной работе над проектом или когда коллеги просят помочь выискать ошибки. В последнем случае действительно страшно. Такие строчки уже нельзя "перепрыгивать". Еще страшнее - несоответствие конструкторов/деструкторов и использования объектов.
Поэтому к чудесам STL, Copy-Constructor, operator= и тд. у меня стойкая неприязнь. Они у меня психологически с напряженным поиском ошибок ассоциируются. И для меня они страшны.
Неизвестный
29.07.2009, 00:51
общий
Evgenijm:
Цитата: 268417
Поэтому к чудесам STL, Copy-Constructor, operator= и тд. у меня стойкая неприязнь.

.NET освобождает от этого. Но такая сборка мусора порождает и свои ньюансы(и усложнения). Например, Вы никогда не можете быть уверены когда именно будет уничтожен объект. В связи с этим для освобождения ресурсов приходится использовать IDisposable и не забывать использовать using(). А в C++ просто надо сразу привыкать правильно реализовывать аллокацию и деаллокацию памяти и ресурсов и тогда меньше приходится отыскивать ошибки.
.NET дает преимущества при написании не критичных к скорости программ. Удобно программировать интерфейс. Более менее нагружающие процессор вычислительные задачи лучше реализовать на C++. Да и в .NET, на данный момент, нет достойных средств распараллеливания задач сравнимых с Intel TBB или хотя бы OMP.
Неизвестный
29.07.2009, 05:01
общий
Micren:
Дело в том, что проблемой диспозинг становится гораздо реже, чем управление жизнедеятельностью в C++. Многие сложные проекты на C++ фактически строятся вокруг какого-нибудь сборщика мусора, т.к. если объект сразу может находиться в десятках контейнеров - проследить его почти нереально. Я иногда использую С++ сам, но в очень обрезаном виде и только очень простые конструкции. Следить за сложными взаимоотношениями - себе дороже.
А TBB и OMP как объект изучения и активного применения очень мало кого интересуетЯ, например, даже намеков на них не видел за свою практику. Хотя в универе даже с группами из Parallel Computing пересекался. Их больше интересует как кучу FPGA-блоков с кластером компов соединить и контролировать вычисления на Java. Может, где-то внутри у них и крутится нечто вроде OMP (я не вникал), но снаружи торчат ФПГА и Ява.
Неизвестный
29.07.2009, 06:46
общий
Evgenijm:
Цитата: 268417
если объект сразу может находиться в десятках контейнеров - проследить его почти нереально

Для облегчения жизни на данный момент есть smart pointers.
Цитата: 268417
А TBB и OMP как объект изучения и активного применения очень мало кого интересует

Именно потому, что это никого не интересует omp включена почти во все современные компиляторы, а Parallel Extension войдет в .Net 4. Если это Вас не интересует, то не значит, что всех.
И вообще, давайте не будем тут развязывать "священные войны" типа C# против C++.
Форма ответа