Konsolenanwendung und Windows Forms



  • Hallo,

    ich habe noch nicht viel Programmiererfahrung mit Visual C++ und habe folgende Frage. Ich hoffe, Ihr könnt mir helfen.

    Ich muss ein Programm erstellen, dass Daten aus einer Datei liest, aus einem Teil dieser Daten ein Formular (für Benutzerinteraktion) erstellen und anschließend mit den eingegebenen Daten und den Daten aus der vorher eingelesenen Datei weiterarbeiten. Das Einlesen bekomme ich wunderbar hin und ich habe inzwischen einen Dummy mit Windows Forms erstellt, aber wie bekomme ich den Wechsel von der Konsolenanwendung (Einlesen der Datei) auf das Windows Forms Formular (Benutzereingabe) und wieder zurück in die Konsolenanwendung (Weiterarbeiten mit den eingegebnen Daten und Daten der Datei) hin? Oder noch besser, gibt es eine Möglichkeit, so ein Fomular auch innerhalb der Konsolenanwendung zu erstellen und darzustellen?

    Ich hoffe, es kann mir jemand weiterhelfen. Schon mal vielen Dank im Voraus!



  • Erstens: Mit "Windows Forms" bist du hier falsch - die gehöhen ins C++/CLI Board.

    Zweitens: Wie es klingt, benötigst du die Konsole nicht wirklich als IO-Medium (sprich: cin und cout für die Interaktion mit dem Nutzer) - das heißt, du könntest deine Datenverarbeitung auch innerhalb der Forms-Anwendung durchführen (wobei ich allerdings nicht sicher bin, wie kompatibel die STL mit .NET ist).



  • Dieser Thread wurde von Moderator/in CStoll aus dem Forum MFC (Visual C++) in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Tut mir leid, dass ich ins falsche Forum gepostet habe! Vielen Dank für den ersten Tipp!

    Es stimmt, dass ich die Konsole nicht als IO-Medium brauche, aber das eigentliche Problem ist, dass sich die genaue Zusammenstellung des Formulars eigentlich erst ergibt, nachdem ich die Datei eingelesen habe (z.B. Bezeichnung und Anzahl von Elementen in einem Drop-Down Menü).

    Gibt es denn eine Möglichkeit so ein Formular wie aus Windows Forms dynamisch zu erstellen (am besten aus einer Konsolenanwendung heraus, da ich danach noch auf andere Klassen zugreifen muss)?



  • Du kannst Dir ja aus den Windows Forms Anwendung heraus vor dem Aufruf Application::Run(...) dein GUI zusammenstellen (nach welchen Plänen auch immer).

    Ich verstehe nicht warum Du eine Konsole brauchst...

    Simon



  • Hmm, das war ja meine Frage, ob das auch ohne diese Konsolenanwendung klappt.

    Wie funktioniert das denn mit dem Einfügen vor dem Run(...)-Aufruf?

    Ich hab jetzt mal schnell ein ganz einfaches Formular erstellt, das nur eine Combo-Box mit zwei Einträgen (Test1 und Test2) enthält.

    Die beiden Codebeispiele bestehen also nur aus dem von Visual C++ erzeugten Code.

    Wie kann ich jetzt zum Beispiel noch einen dritten Eintrag in der Combo-Box erzeugen? Vielleicht gibt mir das den richtigen Schubs, wie ich das hinbekomme!

    Schon mal Danke!

    #pragma once
    
    namespace test {
    
    	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::ComboBox^  comboBox1;
    	protected: 
    
    	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)
    		{
    			this->comboBox1 = (gcnew System::Windows::Forms::ComboBox());
    			this->SuspendLayout();
    			// 
    			// comboBox1
    			// 
    			this->comboBox1->FormattingEnabled = true;
    			this->comboBox1->Items->AddRange(gcnew cli::array< System::Object^  >(2) {L"Test1", L"Test2"});
    			this->comboBox1->Location = System::Drawing::Point(100, 116);
    			this->comboBox1->Name = L"comboBox1";
    			this->comboBox1->Size = System::Drawing::Size(121, 21);
    			this->comboBox1->TabIndex = 0;
    			// 
    			// Form1
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(331, 318);
    			this->Controls->Add(this->comboBox1);
    			this->Name = L"Form1";
    			this->Text = L"Form1";
    			this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
    			this->ResumeLayout(false);
    
    		}
    #pragma endregion
    	private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
    			 }
    	};
    }
    
    // test.cpp : main project file.
    
    #include "stdafx.h"
    #include "Form1.h"
    
    using namespace test;
    
    [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;
    }
    


  • Hallo,

    Wenn Du sowiso immer eine Form hast (was ich denke), dann kannst Du den Code um Application::Run(..) so lassen wie er ist.

    Wenn Du die GUI Elemente wie Buttons, ComboBoxen etc. dynamisch hinzufügen möchtest, dann musst Du eigentlich nicht viel anderen Code erzeugen als der Designer es tun würde. Mit der Ausnahme, dass dann (wahrscheinlich) keine Member- Variablen der Controls erzeugt werden.

    Ich würde am Anfang wie folgt vorgehen:
    Um zu schauen, was für Code Du erzeugen musst, würde ich im Designer das gewünschte Control platzieren wo Du es haben möchtest (z.B. einen Button rechts oben). Dann den von Desginer generierten Code abgucken (er befindet sich in void Form1::InitializeComponent(void), vorausgesetzt deine Form heisst Form1).

    Diesen Code fügst Du dann z.B. im Konstruktor von Form1 ein (nach InitializeComponent), aber natürlich kannst Du, mit ein paar Ausnahmen, die Controls erzeugen wann und wo Du möchtest.

    Dann, wenn das Control erzeugt ist, musst Du es noch deiner Form bekanntmachen (mit this->Controls->Add(...).

    Die nächste Hürde wird für dich dann sein, entsprechende Event Handler zu erzeugen und die Controls wieder anzusprechen. Findest Du aber bestimmt raus. 🙂

    Hier ein Bsp. für einen Button:

    Form1(void)
    {
    	InitializeComponent();
    
    	Button^ button = gcnew Button();
    	button->Location = System::Drawing::Point(25, 25);
    	button->Name = L"button1";
    	button->Size = System::Drawing::Size(75, 23);
    	button->TabIndex = 0;
    	button->Text = L"button1";
    	button->UseVisualStyleBackColor = true;
    	this->Controls->Add(button);
    }
    

    Darf ich fragen, warum Du gleich mit C++/CLI einsteigst?

    Grüsse
    Simon



  • Nein darfst Du nicht.
    Darf ich fragen warum Du Grüße mit doppelt s schreibst.



  • 🙂 weiss nid, schriibts mer nid so?



  • Die letzte Nachricht war nicht von mir!



  • Hab noch vergessen, dir zu danken, Simon!!!



  • Ist gern geschehen... 🙂


Anmelden zum Antworten