Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Запись значения в TextBox формы из другого файла проекта / 7 сообщений из 7, страница 1 из 1
06.10.2016, 10:38
    #39321683
Warlock86
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись значения в TextBox формы из другого файла проекта
Имеется проект на Visual C++/CLI. В проекте есть форма (файлы MyForm.h и MyForm.cpp). На форме расположено текстовое поле textBox1. Также в проекте есть ещё два файла: globals.h и globals.cpp. В файле globals.cpp есть процедура textOut(char* s), которая выводит MessageBox с текстом из входного параметра. Функция textOut вызывается при загрузке формы. Требуется изменить функцию textOut таким образом, чтобы вместо вывода MessageBox она записывала входной параметр в текстовое поле textBox1 формы MyForm.

MyForm.h
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
#ifndef _MYFORM_H
#define _MYFORM_H
#pragma once
#include <math.h>
#include <windows.h>
#include "globals.h"

namespace TestForm2 {

	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 MyForm
	/// </summary>
	public ref class MyForm : public System::Windows::Forms::Form
	{
	public: array <ListBox ^>^ lbArr;
    int colnum;

	public:
		static MyForm^ TheInstance;

		MyForm(void)
		{
			InitializeComponent();
			//
			//TODO: Add the constructor code here
			//
			 TheInstance = this;

		}

	protected:
		/// <summary>
		/// Clean up any resources being used.
		/// </summary>
		~MyForm()
		{
			if (components)
			{
				delete components;
			}
		}
	public: System::Windows::Forms::TextBox^  textBox1;
	private: System::Windows::Forms::ListBox^  lbLocs;
	private: System::Windows::Forms::ListBox^  lbObjs;
	private: System::Windows::Forms::ListBox^  lbInv;

	


	protected: 

	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)
		{
			System::ComponentModel::ComponentResourceManager^  resources = (gcnew System::ComponentModel::ComponentResourceManager(MyForm::typeid));
			this->textBox1 = (gcnew System::Windows::Forms::TextBox());
			this->lbLocs = (gcnew System::Windows::Forms::ListBox());
			this->lbObjs = (gcnew System::Windows::Forms::ListBox());
			this->lbInv = (gcnew System::Windows::Forms::ListBox());
			this->SuspendLayout();
			// 
			// textBox1
			// 
			resources->ApplyResources(this->textBox1, L"textBox1");
			this->textBox1->Name = L"textBox1";
			this->textBox1->ReadOnly = true;			
			// 
			// lbLocs
			// 
			resources->ApplyResources(this->lbLocs, L"lbLocs");
			this->lbLocs->FormattingEnabled = true;
			this->lbLocs->Items->AddRange(gcnew cli::array< System::Object^  >(6) {resources->GetString(L"lbLocs.Items"), resources->GetString(L"lbLocs.Items1"), 
				resources->GetString(L"lbLocs.Items2"), resources->GetString(L"lbLocs.Items3"), resources->GetString(L"lbLocs.Items4"), resources->GetString(L"lbLocs.Items5")});
			this->lbLocs->Name = L"lbLocs";
			this->lbLocs->KeyDown += gcnew System::Windows::Forms::KeyEventHandler(this, &MyForm::MyForm_KeyDown);
			// 
			// lbObjs
			// 
			resources->ApplyResources(this->lbObjs, L"lbObjs");
			this->lbObjs->FormattingEnabled = true;
			this->lbObjs->Items->AddRange(gcnew cli::array< System::Object^  >(2) {resources->GetString(L"lbObjs.Items"), resources->GetString(L"lbObjs.Items1")});
			this->lbObjs->Name = L"lbObjs";
			this->lbObjs->KeyDown += gcnew System::Windows::Forms::KeyEventHandler(this, &MyForm::MyForm_KeyDown);
			// 
			// lbInv
			// 
			resources->ApplyResources(this->lbInv, L"lbInv");
			this->lbInv->FormattingEnabled = true;
			this->lbInv->Items->AddRange(gcnew cli::array< System::Object^  >(3) {resources->GetString(L"lbInv.Items"), resources->GetString(L"lbInv.Items1"), 
				resources->GetString(L"lbInv.Items2")});
			this->lbInv->Name = L"lbInv";
			this->lbInv->KeyDown += gcnew System::Windows::Forms::KeyEventHandler(this, &MyForm::MyForm_KeyDown);
			// 
			// MyForm
			// 
			resources->ApplyResources(this, L"$this");
			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
			this->Controls->Add(this->lbInv);
			this->Controls->Add(this->lbObjs);
			this->Controls->Add(this->lbLocs);
			this->Controls->Add(this->textBox1);
			this->MaximizeBox = false;
			this->Name = L"MyForm";
			this->Load += gcnew System::EventHandler(this, &MyForm::MyForm_Load);
			this->ResumeLayout(false);
			this->PerformLayout();

		}
#pragma endregion
	private: System::Void MyForm_Load(System::Object^  sender, System::EventArgs^  e) {

				 

				 FontFamily^ myFontFamily = gcnew FontFamily( "Arial" );
				 int lineSpacing = myFontFamily->GetLineSpacing( FontStyle::Regular);
				 float h0=MyForm::Height;
				 float h1=textBox1->Font->Height;
				 float h2=textBox1->Font->Size;
				 float f = (((h0-16) / 15) / (h1/h2));
				 lbLocs->Select();
				 lbLocs->SelectedIndex=0;

				 lbArr=gcnew array<ListBox ^>(3);
				 lbArr[0]=lbLocs;
				 lbArr[1]=lbObjs;
				 lbArr[2]=lbInv;
				 colnum=1;
		
				 textOut("Test, test, test!");
				 
 

			 }

	

private: System::Void MyForm_KeyDown(System::Object^  sender, System::Windows::Forms::KeyEventArgs^  e) {
			 int si;
			 
			 if(e->KeyCode == Keys::Right ) {
				 si=lbArr[colnum-1]->SelectedIndex;
				 lbArr[colnum-1]->ClearSelected();
				 do {
					 colnum++;
				 if(colnum>3){
					 colnum=1;
				 }
				 } while(lbArr[colnum-1]->Items->Count==0);
				 lbArr[colnum-1]->Select();
				 if(lbArr[colnum-1]->Items->Count<si+1){
					 lbArr[colnum-1]->SelectedIndex=lbArr[colnum-1]->Items->Count-1;
				 } else {
					 lbArr[colnum-1]->SelectedIndex=si;
				 }
				 				 
				 e->SuppressKeyPress = true;
			 }
			 if(e->KeyCode == Keys::Left ) {
				 si=lbArr[colnum-1]->SelectedIndex;
				 lbArr[colnum-1]->ClearSelected();
				 do {
					 colnum--;
				 if(colnum<1){
					 colnum=3;
				 }
				 } while(lbArr[colnum-1]->Items->Count==0);
				 lbArr[colnum-1]->Select();
				 if(lbArr[colnum-1]->Items->Count<si+1){
					 lbArr[colnum-1]->SelectedIndex=lbArr[colnum-1]->Items->Count-1;
				 } else {
					 lbArr[colnum-1]->SelectedIndex=si;
				 }

				 e->SuppressKeyPress = true;
			 }
		 }


};
}

#endif



MyForm.cpp
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
#include "MyForm.h"

using namespace System;
using namespace System::Windows::Forms;

[STAThread]//leave this as is
void main(array<String^>^ args) {
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false);
	Application::Run(gcnew TestForm2::MyForm);
}



globals.h
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
#ifndef _GLOBALS_H
#define _GLOBALS_H


 void textOut(char* s);


#endif



globals.cpp
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#include <vector>
#include "globals.h"
#include <windows.h>
#include "MyForm.h"


using namespace System::Windows::Forms;

	 void textOut(char* s) {
		 System::String^ str=gcnew System::String(s);
		 MessageBox::Show( str, "Сообщение", MessageBoxButtons::OK, MessageBoxIcon::Warning ); 

		 //TestForm2::MyForm::textBox1->Text=str;
	 }



При попытке раскомментировать последнюю строчку, появляется ошибка: "a non static reference must be relative to a specific object".

Я так понимаю, нужно каким-то образом передать в функцию указатель на форму MyForm. Подскажите, пожалуйста, как это можно сделать?
...
Рейтинг: 0 / 0
06.10.2016, 11:34
    #39321744
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись значения в TextBox формы из другого файла проекта
Warlock86
Я так понимаю, нужно каким-то образом передать в функцию указатель на форму MyForm. Подскажите, пожалуйста, как это можно сделать?
никак, у тебя же по постановке задачи структура функции фиксирована, так?
...
Рейтинг: 0 / 0
06.10.2016, 11:48
    #39321763
Warlock86
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись значения в TextBox формы из другого файла проекта
Структура функции фиксирована. Но, может быть, можно добавить какую-нибудь глобальную переменную, и в неё уже передавать указатель на форму при старте программы, а потом считать оттуда в globals.cpp? В крайнем случае можно и поменять структуру функции, но когда я пытался изменить её на textOut(char* s,TestForm2::MyForm^ f) и вызывать как textOut("Test, test, test!") возникают ошибки: "'TestForm2' : is not a class or namespace name" и "syntax error : identifier 'MyForm'".
...
Рейтинг: 0 / 0
06.10.2016, 11:49
    #39321766
Warlock86
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись значения в TextBox формы из другого файла проекта
В предыдущем сообщении опечатка " вызывать как textOut("Test, test, test!",this) ".
...
Рейтинг: 0 / 0
06.10.2016, 17:47
    #39322205
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись значения в TextBox формы из другого файла проекта
Warlock86Структура функции фиксирована. Но, может быть, можно добавить какую-нибудь глобальную переменную, и в неё уже передавать указатель на форму при старте программы, а потом считать оттуда в globals.cpp? В крайнем случае можно и поменять структуру функции, но когда я пытался изменить её на textOut(char* s,TestForm2::MyForm^ f) и вызывать как textOut("Test, test, test!") возникают ошибки: "'TestForm2' : is not a class or namespace name" и "syntax error : identifier 'MyForm'".

Ну, добавь глобальную переменную...
В чём проблема ?
...
Рейтинг: 0 / 0
07.10.2016, 02:12
    #39322361
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись значения в TextBox формы из другого файла проекта
Warlock86процедура textOut(char* s)Delphi здесь. Он пришёл в наши края. Мы должны сплотиться. Фильм «300 плюсовиков».

Warlock86Но, может быть, можно добавить какую-нибудь глобальную переменную, и в неё уже передавать указатель на форму при старте программы, а потом считать оттуда в globals.cpp?Такая переменная уже есть, только она не глобальная, а static:
Warlock86
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
namespace TestForm2 {
	...
	public ref class MyForm ...
	{
		...
		static MyForm^ TheInstance;
		...
};
}

Используем так:
Код: plaintext
1.
TestForm2::MyForm::TheInstance->textBox1->Text = str;


Warlock86В крайнем случае можно и поменять структуру функции, но когда я пытался изменить её на textOut(char* s,TestForm2::MyForm^ f) и вызывать как textOut("Test, test, test!") возникают ошибки: "'TestForm2' : is not a class or namespace name" и "syntax error : identifier 'MyForm'".Потому что надо было писать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
#ifndef _GLOBALS_H
#define _GLOBALS_H

#include "MyForm.h"

void textOut(char* s, TestForm2::MyForm^ f);

#endif

И кстати параметр функции лучше делать « const char* s», в честь того, что мы не меняем содержимое строки.
...
Рейтинг: 0 / 0
07.10.2016, 12:21
    #39322654
Warlock86
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись значения в TextBox формы из другого файла проекта
Благодарю. С
Код: plaintext
1.
TestForm2::MyForm::TheInstance->textBox1->Text = str;

всё заработало.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Запись значения в TextBox формы из другого файла проекта / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]