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

RFpro.ru: Microsoft .NET

  Все выпуски  

RFpro.ru: Microsoft .NET


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

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

Лучшие эксперты по данной тематике

Асмик Гаряка
Статус: Советник
Рейтинг: 10967
∙ повысить рейтинг »
Micren
Статус: Профессор
Рейтинг: 1795
∙ повысить рейтинг »
Александр Чекменёв
Статус: Профессор
Рейтинг: 1372
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Microsoft .NET : C#

Номер выпуска:234
Дата выхода:29.06.2012, 13:00
Администратор рассылки:Alexey G. Gladenyuk (Управляющий)
Подписчиков / экспертов:74 / 32
Вопросов / ответов:3 / 5

Консультация # 164086: Пишу в MS Visual Studio. Проект Visual C++ Windows Form Application. В файле "Form1.h" содержится класс описывающий форму, в файле "HF.h" содержатся мои собственные классы, всё работает, но, как из файла "HF.h" обращаться к форме ? В файле ".cpp" порядок инклудов такой: сначала "HF.h", затем &quo...


Консультация # 177907: Напишите программу, которая пересчитывает стоимость валют, демонстрируя обработку одной функцией нескольких компонентов (выбор вида валюты и курса)...
Консультация # 80942: Здравствуйте! Подскажите, пожалуйста, грамотный способ чтения/записи из/в файла в С++.NET. Отличаются ли в этой среде обращение к файлу от любой другой (на языке С++)? Заранее благодарю....

Консультация # 164086:

Пишу в MS Visual Studio. Проект Visual C++ Windows Form Application.
В файле "Form1.h" содержится класс описывающий форму, в файле "HF.h" содержатся мои собственные классы, всё работает, но, как из файла "HF.h" обращаться к форме ? В файле ".cpp" порядок инклудов такой: сначала "HF.h", затем "Form1.h", т.е. мои классы не знаю ни про какую форму. Или может я что-то неправильно делаю ? Надеюсь доступно объяснил

Дата отправки: 04.04.2009, 08:54
Вопрос задал: Юрий Анатольевич
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Micren (Профессор):

Здравствуйте, Юрий Анатольевич!
Вот пример приложения построенного по типу Документ-Представление
В программе 2 класса.
1й форма(Form1.h):

Код :
#include "TestClass.h"

#pragma once

namespace My164086 {

	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::Label^  label1;
	protected: 
	private: System::Windows::Forms::TextBox^  textBox1;
	private: System::Windows::Forms::Button^  button1;
	private: System::Windows::Forms::Button^  button2;

	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->label1 = (gcnew System::Windows::Forms::Label());
			this->textBox1 = (gcnew System::Windows::Forms::TextBox());
			this->button1 = (gcnew System::Windows::Forms::Button());
			this->button2 = (gcnew System::Windows::Forms::Button());
			this->SuspendLayout();
			// 
			// label1
			// 
			this->label1->AutoSize = true;
			this->label1->Location = System::Drawing::Point(9, 9);
			this->label1->Name = L"label1";
			this->label1->Size = System::Drawing::Size(177, 13);
			this->label1->TabIndex = 0;
			this->label1->Text = L"Поле для ввода тестовой строки:";
			// 
			// textBox1
			// 
			this->textBox1->Location = System::Drawing::Point(12, 26);
			this->textBox1->Name = L"textBox1";
			this->textBox1->Size = System::Drawing::Size(340, 20);
			this->textBox1->TabIndex = 1;
			// 
			// button1
			// 
			this->button1->Enabled = false;
			this->button1->Location = System::Drawing::Point(12, 52);
			this->button1->Name = L"button1";
			this->button1->Size = System::Drawing::Size(340, 23);
			this->button1->TabIndex = 0;
			this->button1->TabStop = false;
			this->button1->Text = L"Кнопка включится когда будет введено 10 символов";
			this->button1->UseVisualStyleBackColor = true;
			// 
			// button2
			// 
			this->button2->Location = System::Drawing::Point(13, 82);
			this->button2->Name = L"button2";
			this->button2->Size = System::Drawing::Size(339, 23);
			this->button2->TabIndex = 0;
			this->button2->TabStop = false;
			this->button2->Text = L"Преобразовать к верхнему регистру";
			this->button2->UseVisualStyleBackColor = true;
			// 
			// Form1
			// 
			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
			this->ClientSize = System::Drawing::Size(364, 124);
			this->Controls->Add(this->button2);
			this->Controls->Add(this->button1);
			this->Controls->Add(this->textBox1);
			this->Controls->Add(this->label1);
			this->MaximizeBox = false;
			this->MaximumSize = System::Drawing::Size(380, 160);
			this->MinimizeBox = false;
			this->MinimumSize = System::Drawing::Size(380, 160);
			this->Name = L"Form1";
			this->Text = L"Form1";
			this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
			this->ResumeLayout(false);
			this->PerformLayout();

		}
#pragma endregion
		// Обработчик события Load
	private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
				 // Создаем документ
				 document=gcnew TestDocument();
				 button1->Click+=gcnew EventHandler(document,&TestDocument::Button1ClickEventHandler);
				 button2->Click+=gcnew EventHandler(document,&TestDocument::Button2ClickEventHandler);
				 // Связываем документ с контролами формы
				 textBox1->DataBindings->Add(gcnew Binding(L"Text",document,L"Str",false,DataSourceUpdateMode::OnPropertyChanged,String::Empty));
				 button1->DataBindings->Add(gcnew Binding(L"Enabled",document,L"EnabledButton"));
				 button1->DataBindings->Add(gcnew Binding(L"Text",document,L"Button1Caption"));
				 button2->DataBindings->Add(gcnew Binding(L"Text",document,L"Button2Caption"));
				 // И больше ни о чем не беспокоимся
			 }

			 TestDocument^ document;

	};
}

2й класс обработки данных формы(TestClass.h):
Код :
#pragma once

using namespace System;
using namespace System::ComponentModel;

namespace My164086
{
	ref class TestDocument:INotifyPropertyChanged // Этот интерфейс позволяет посылать события об исменении свойств документа
	{
	public:
		// Конструктор. Ничего необычного
		TestDocument()
		{
			EnabledButton=false;
			Str=String::Empty;
			Button1Caption=L"Кнопка включится когда будет введено 10 символов";
			Button2Caption=L"Преобразование к верхнему регистру";
			toUpCase=true;
		}
		// Обработчики событий от кнопок
		void Button1ClickEventHandler(Object^ sender,EventArgs^ e)
		{
			Str=String::Empty;
		}
		void Button2ClickEventHandler(Object^ sender,EventArgs^ e)
		{
			if(toUpCase)
			{
				Str=Str->ToUpper();
				Button2Caption=L"Преобразовать к нижнему регистру";
			}
			else
			{
				Str=Str->ToLower();
				Button2Caption=L"Преобразовать к верхнему регистру";
			}
			toUpCase^=true;
		}
		// Свойство Str
		property String^ Str
		{
			String^ get(){return str;}
			void set(String^ val)
			{
				if(val!=str)
				{
					// Если свойство изменилось - обработаем его
					str=val;
					// И пошлем событие
					NotifyPropertyChanged(L"Str");
					// Включим или выключим кнопку
					if(str->Length<10)EnabledButton=false;
					else EnabledButton=true;
				}
			}
		}
		// Свойство включения кнопки
		property bool EnabledButton
		{
			bool get(){return enabledButton;}
			void set(bool val)
			{
				if(enabledButton!=val)
				{
					enabledButton=val;
					NotifyPropertyChanged(L"EnabledButton");
					if(enabledButton)Button1Caption=L"Теперь нажав на кнопку можно очистить поле ввода";
					else Button1Caption=L"Снова ждем 10 символов";
				}
			}
		}
		// Заголовки кнопок
		property String^ Button1Caption
		{
			String^ get(){return button1Caption;}
			void set(String^ val)
			{
				if(val!=button1Caption)
				{
					button1Caption=val;
					NotifyPropertyChanged(L"Button1Caption");
				}
			}
		}
		property String^ Button2Caption
		{
			String^ get(){return button2Caption;}
			void set(String^ val)
			{
				if(val!=button2Caption)
				{
					button2Caption=val;
					NotifyPropertyChanged(L"Button2Caption");
				}
			}
		}
		// Событие
		virtual event PropertyChangedEventHandler^ PropertyChanged;
	private:
		// Этот метод просто генерирует событие
		void NotifyPropertyChanged(String^ info)
		{
			PropertyChanged(this,gcnew PropertyChangedEventArgs(info));
		}
		// Скрытые члены
		String^ str;
		bool enabledButton;
		String^ button1Caption;
		String^ button2Caption;
		bool toUpCase;
	};
}

main()
Код :
#include "stdafx.h"
#include "Form1.h"

using namespace My164086;

[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
	// Enabling Windows XP visual effects before any controls are created
	Application::EnableVisualStyles();
	Application::SetCompatibleTextRenderingDefault(false); 

	// Create the main window and run it
	Application::Run(gcnew Form1());
	return 0;
}

Обратите внимание, что ни один класс не работает напрямую со свойствами другого. Тем не менее все работает. Связь между ними происходит через класс Binding и события.
Это, конечно, демонстрационный пример. И в простых приложениях можно обойтись без этого.
Но! Такой метод программирования избавит Вас от головной боли в дальнейшем. И упростит дальнейшую модификацию приложения. Так как чем меньше части кода связаны друг с другом, тем меньше вероятность, что при изменении одной части возникнет необходимость в серьезном изменении другой.

Проект для MS Visual Studio 2008 Вы можете скачать по ссылке: http://rusfaq.ru/upload/1572

Консультировал: Micren (Профессор)
Дата отправки: 05.04.2009, 09:06
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 177907:

Напишите программу, которая пересчитывает стоимость валют, демонстрируя обработку одной функцией нескольких компонентов (выбор вида валюты и курса)

Дата отправки: 17.04.2010, 21:31
Вопрос задал: Кондаков Александр Олегович
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Andrew Kovalchuk aka Antanel (Профессор):

Здравствуйте, Кондаков Александр Олегович.
Прилагаемый пример, имхо, удовлетворяет условию задачи.

Приложение:

Консультировал: Andrew Kovalchuk aka Antanel (Профессор)
Дата отправки: 18.04.2010, 01:29
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 80942:

Здравствуйте!
Подскажите, пожалуйста, грамотный способ чтения/записи из/в файла в С++.NET. Отличаются ли в этой среде обращение к файлу от любой другой (на языке С++)?
Заранее благодарю.

Дата отправки: 03.04.2007, 22:38
Вопрос задал: Steazy
Всего ответов: 3
Страница онлайн-консультации »


Консультирует Bevice:

Здравствуйте, Steazy!
Чтением/записью в .net заведуют классы представленные в System.IO

Консультировал: Bevice
Дата отправки: 04.04.2007, 09:21
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Necrostaz:

Здравствуйте, Steazy! За запись/чтение в .net отвечает абстракция System.IO.Stream. Базовая реализация поддерживает синхронное чтение/запись байт, а также seeking (поиск). В зависимости от конкретной задачи есть множество реализаций наследников и компонент, использующих потоки. В частности для файлов можно использовать FileStream и\или StreamWriter\StreamWriter

Консультировал: Necrostaz
Дата отправки: 04.04.2007, 12:31
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Thread:

Здравствуйте, Steazy!
Все зависит от того с каки файлом вы работаете. Если это некий binary-файл, то лучше использовать класс FileStream и читать побайтно. Если же вы работаете с текстовым файлом. то на мой взгялд самый удобный способ работы с ними это создать экземпляры классов StreamReader и StreamWriter, передав в конструктор экземпляр класса FileStrem. Далее уже используяте методы ReadLine() и WriteLine().

Консультировал: Thread
Дата отправки: 04.04.2007, 16:59
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное