Anfängerfrage: Methode um auf TextBox zugreifen zu können
-
Hallo Community,
ich arbeite mich wegen einer Projektarbeit in die Programmierung mit C++/CLI ein. Dazu stetze ich VS2010 und VAssistX ein. Besonders weit bin ich noch nicht gekommen. Deshalb hier eine Frage.
Wie kann ich eine Funktion oder Methode bereitstellen, mit der ich in eine TextBox schreiben kann? (ohne die Textbox selbst zugreifbar zu machen)
Ich habe eine Form mit 3 Buttons und einer TextBox erzeugt (Form1.h)
Dort wollte ich eine Methode erstellen, mit der ich aus anderen Modulen in die TextBox schreiben kann.Im gleichen Modul (Form1.h) kann ich auf die Methode zugreifen, bspw. durch drücken des Button3.
In einen anderen Modul "TrackerSupport.cpp" jedoch nicht auf die Methode zugreifen. Die Fehlermeldung lautet:TrackerSupport.cpp(20) error C2352: 'TrackerSupport::Form1::LogToTxtBox': Unzulässiger Aufruf einer nicht statischen Memberfunktion
Was mache ich falsch?
Anbei der Code der beiden Module
TrackerSupport.cpp
#include "stdafx.h" #include "Form1.h" #include <string> #include <iostream> #include <fstream> using namespace TrackerSupport; using namespace std; using namespace System::IO; [STAThreadAttribute] int main(array<System::String ^> ^args) { Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); Application::Run(gcnew Form1()); Form1::LogToTxtBox("hello world"); return 0; }
Form1.h
#pragma once namespace TrackerSupport { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Data; using namespace System::Drawing; using namespace System::IO; using namespace System::Text; using namespace System::Windows::Forms; public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); } protected: ~Form1() { if (components) { delete components; } } private: System::Windows::Forms::TextBox^ textBox1; private: System::Windows::Forms::Button^ button1; private: System::Windows::Forms::Button^ button2; private: System::Windows::Forms::SaveFileDialog^ saveFileDialog1; private: System::Windows::Forms::Button^ button3; private: System::ComponentModel::Container ^components; #pragma region Windows Form Designer generated code void InitializeComponent(void) { this->textBox1 = (gcnew System::Windows::Forms::TextBox()); this->button1 = (gcnew System::Windows::Forms::Button()); this->button2 = (gcnew System::Windows::Forms::Button()); this->saveFileDialog1 = (gcnew System::Windows::Forms::SaveFileDialog()); this->button3 = (gcnew System::Windows::Forms::Button()); this->SuspendLayout(); // textBox1 this->textBox1->Anchor = static_cast<System::Windows::Forms::AnchorStyles>((((System::Windows::Forms::AnchorStyles::Top | System::Windows::Forms::AnchorStyles::Bottom) | System::Windows::Forms::AnchorStyles::Left) | System::Windows::Forms::AnchorStyles::Right)); this->textBox1->Location = System::Drawing::Point(12, 46); this->textBox1->Multiline = true; this->textBox1->Name = L"textBox1"; this->textBox1->Size = System::Drawing::Size(476, 209); this->textBox1->TabIndex = 0; this->textBox1->TextChanged += gcnew System::EventHandler(this, &Form1::textBox1_TextChanged); // button1 this->button1->Location = System::Drawing::Point(12, 12); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(81, 28); this->button1->TabIndex = 1; this->button1->Text = L"save as"; this->button1->UseVisualStyleBackColor = true; this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click); // button2 this->button2->Location = System::Drawing::Point(99, 12); this->button2->Name = L"button2"; this->button2->Size = System::Drawing::Size(81, 28); this->button2->TabIndex = 2; this->button2->Text = L"Append text"; this->button2->UseVisualStyleBackColor = true; this->button2->Click += gcnew System::EventHandler(this, &Form1::button2_Click); // saveFileDialog1 this->saveFileDialog1->FileOk += gcnew System::ComponentModel::CancelEventHandler(this, &Form1::saveFileDialog1_FileOk); // button3 this->button3->Location = System::Drawing::Point(186, 12); this->button3->Name = L"button3"; this->button3->Size = System::Drawing::Size(81, 28); this->button3->TabIndex = 3; this->button3->Text = L"button3"; this->button3->UseVisualStyleBackColor = true; this->button3->Click += gcnew System::EventHandler(this, &Form1::button3_Click); // Form1 this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(500, 267); this->Controls->Add(this->button3); this->Controls->Add(this->button2); this->Controls->Add(this->button1); this->Controls->Add(this->textBox1); this->Name = L"Form1"; this->Text = L"TrackerLog"; this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load); this->ResumeLayout(false); this->PerformLayout(); } #pragma endregion private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { } private: System::Void textBox1_TextChanged(System::Object^ sender, System::EventArgs^ e) { } // 'save as' button ------------------------- public: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { saveFileDialog1->InitialDirectory = "."; // aktuelles Verzeichnis als Vorgabe saveFileDialog1->Filter = "Textdateien (*.txt)|*.txt"; // Dateifilter konfigurieren: *.txt saveFileDialog1->FilterIndex = 1; saveFileDialog1->FileName = ""; if (saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) { try { StreamWriter ^sw = gcnew StreamWriter(saveFileDialog1->FileName,false,Encoding::GetEncoding("windows-1252")); sw->Write(textBox1->Text); } catch (IOException^) { MessageBox::Show("Datei konnte nicht geöffnet werden"); } } } // 'append text' button - - - - - - - - - - - private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { textBox1->AppendText("appended text;"); } public: void LogToTxtBox(String^ txt) { this->textBox1->AppendText(txt); } public: Void LogToTxtBox(TextBox^ box, String^ txt) { box->AppendText(txt); } private: System::Void saveFileDialog1_FileOk(System::Object^ sender, System::ComponentModel::CancelEventArgs^ e) { } private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) { String^ str2 =gcnew String("button3"); this->LogToTxtBox(textBox1,str2); this->LogToTxtBox(str2); } }; }
Vielen Dank im Voraus,
Gruß neckisch
-
Es gibt zwei Probleme:
1. Form1::.. ist die Klasse und nicht das Objekt der Klasse. Um auf die Member der Klasse zuzugreifen benötigst Du aber ein Objekt!
2. Application::Run(..) kehrt erst wieder zurück, wenn die Applikation geschlossen wird. Es macht also kein Sinn dort diesen Aufruf zu plazieren.
-
Der richtige Weg ist in der View ein public Property zu machen, welches Du dann in Deiner externen Methode setzen kannst. Dazu musst Du natürlich die Instanz der Form der externen Methode mitgeben.
Im Form musst Du dann beim setzen des Properties entsprechend den Text anzeigen, was und wo Du willst.Und beachte dabei immer noch:
http://blog.kalmbach-software.de/de/2010/03/05/ccli-und-winforms-macht-keinen-sinn/