Announcement

Collapse
No announcement yet.

Windows Forms und Übergabe Objekte?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Windows Forms und Übergabe Objekte?

    Hallo, bin neu hier und habe durch die Suchfunktion auf meine Frage keine Antwort gefunden. Ich benutze VC++ mit .NET und hänge seit 2 Tagen bei folgendem Problem:

    Ich habe Form1.cpp (mit Form1.h) und BExcel.cpp (mit BExcel.h). In der Applikation werden (mit Hilfe von Methoden aus BExcel) XLS-Files geladen und die Namen der verschiedenen Worksheets (falls vorhanden) einer Excel-Datei in einer ComboBox aufgelistet. Klappt wunderbar.

    Jetzt sollen nach manueller Auswahl (Mausklick) eines Worksheets die Namen der Spaltennamen des Worksheets in einer Listbox daneben gezeigt werden. Theoretisch kein Problem, jedoch muss ich das erstelle Objekt ("BExcel be;") an die "private: System::Void ComboBoxWorkSheets_SelectedIndexChanged(System::Ob ject * sender, System::EventArgs * e)" in der Datei "Form1.h" übergeben, sonst kennt sie das geladene File (das ja nun an dem Excel Objekt "hängt") nicht und kann die Methode "ListColNames(be);" nicht aufrufen, weil ihr das Objekt nicht zur Verfügung steht.


    Frage: Wie übergebe ich der o.g. Methode das Objekt damit die Methode "ListColNames(be);" damit aufgerufen werden kann, um bei Mausklick auf ein Worksheet die Spaltennamen aufzulisten? Ich habe bisher versucht, ein globales Objekt in Form1.cpp zu definieren aber das funktioniert nicht. Form1.cpp kennt alles von Form1.h aber Form1.h kennt das dort deklarierte BExcel Objekt aus Form1.cpp nicht.

    Minimalbeispiel als Code anbei. Für andere Tipps, was z.B. guten Programmierstil angeht, bin ich immer äusserst dankbar! Vielen Dank schon mal im voraus.

    Form1.h:
    Code:
    #pragma once
    #include "BExcel.hpp"
    #include <string>
    #include <vcclr.h>
    
    using namespace YExcel;
    
    namespace testwinforms
    {
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    	using namespace System::Runtime::InteropServices;
    	using namespace std;
        				       
    	public __gc class Form1 : public System::Windows::Forms::Form
    	{	
    	public:
    		Form1(void)
    		{
    			InitializeComponent();
    		}
      
    	protected:
    		void Dispose(Boolean disposing)
    		{
    			if (disposing && components)
    			{
    				components->Dispose();
    			}
    			__super::Dispose(disposing);
    		}
    
    	private: System::Windows::Forms::MainMenu *  mainMenu1;
      (...)
    
    	private:
    		System::ComponentModel::Container * components;
    		void InitializeComponent(void)
    		{
    			this->mainMenu1 = new System::Windows::Forms::MainMenu();
    			this->FileMenu = new System::Windows::Forms::MenuItem();
    			(...)
    
    		}	
    
    public: void LoadXLSFile();
    
    private: System::Void FileLoad_Click(System::Object *  sender, System::EventArgs *  e)
    		 {	 					
    				LoadXLSFile();
    		 }
    
    private: void ListWorksheets(BExcel* bexcel);
    		
    private: void ListColNames(BExcel* bexcel);
    
    private: System::Void ComboBoxWorkSheets_SelectedIndexChanged(System::Object *  sender, System::EventArgs *  e)
    		 {			
    			 ListColNames(&bexcel); // FÜHRT ZU FEHLER!
    		      // ListColNames(*bexcel); // FÜHRT AUCH ZU FEHLER!
    		 }
    };
    }
    Form1.cpp:
    Code:
    #include "stdafx.h"
    #include "Form1.h"
    #include "stdafx.h" 
    #include "BExcel.hpp"
    #include <windows.h>
    
    using namespace testwinforms;
    using namespace YExcel;
     
    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
    	System::Threading::Thread::CurrentThread->ApartmentState = System::Threading::ApartmentState::STA;
    	Application::Run(new Form1());
    	return 0;
    }
    
    BExcel bexcel;
    
    void Form1::LoadXLSFile()
    		{
    			        // Sicherheitsabfrage fehlt, ob aktuelles file save oder close oder abort
    			 		System::Windows::Forms::OpenFileDialog* dlg = new OpenFileDialog();
    					dlg->Filter="Excel (*.xls)|*.xls";
    					if(System::Windows::Forms::DialogResult::OK==dlg->ShowDialog()) {
    						String *strPath = dlg->FileName; // Pointer auf Pfad
    						const char* cPath = (char*)(void*)Marshal::StringToHGlobalAnsi(strPath); //String* to char*	
                           
    						try{
    							FileCloser();
    							if (bexcel.Load(cPath)) {
    								FileSave->set_Enabled(1);
    								FileSaveAs->set_Enabled(1);
    								FileClose->set_Enabled(1);
    								ComboBoxWorkSheets->set_Enabled(1);
    								labelCurrentFile->Text=String::Concat("Current File: ",cPath);								
                                 	statusBar_FileSucLoaded->Text = "File has been loaded successfully.";
    								statusBar->ShowPanels = true;
    
    							    ListWorksheets(&bexcel); // FUNKTIONIERT
    							}						
    							else {
    							    statusBar->ShowPanels = false;
    							}
    						}
    						catch (exception ex){};				 
    					}
    		}
    
    void Form1::ListColNames(BExcel* bexcel) {...}
    
    void Form1::ListWorksheets(BExcel* bexcel)
    		 {	
    			 int strTotalWorkSheets = bexcel->GetTotalWorkSheets();
    			 if (strTotalWorkSheets==1)
    (...)
    		 }
    Das Anlegen eines Member "Bexcel bexcel;" in der Klasse Forms1 führt zum Fehler "Form1.h(30): error C3633: cannot define 'bexcel' as a member of managed 'testwinforms::Form1''.

    Ich hänge an dem Problem nun 2 Tage, vielleicht kann mir jemand helfen?
Working...
X