array einer Klasse statisch anlegen



  • Hallo zusammen,

    ich bin relativ neu mit dem Programmieren in Visual C++/CLI.

    Ich würde gerne ein array einer selbsterstellten Klasse statisch anlegen.
    Hintergrund ist dass ich es in einer Ereignisroutine mit Daten aus einer Datenbank füllen und in einer anderen Ereignisroutine auslesen möchte.

    Irgendwie fiúnktioniert es aber nicht.

    Klasse:

    #pragma once
    
    using namespace System;
    
    ref class LSProduktionslos
    {
    private:
       int gesamt;
       int gut;
       int schlecht;
       int zuLang;
       int zuLangUndzuSchwer;
       int zuKurz;
       int zuKurzUndzuLeicht;
       int zuSchwer;
       int zuLeicht;
       int metall;
    
    public:
       LSProduktionslos(void);
    
       property int Gesamt
       {
          int get();
          void set(int ges);
       }
    
       ...
    
    };
    

    Programmcode:

    ...
    
    #pragma endregion
    
    static int Loszahl;
    static array<LSProduktionslos^>^ ProdLos;
    
    private: System::Void EinzelcodeTrendbetrachtung_Load(System::Object^  sender, System::EventArgs^  e) 
             {
               System::Windows::Forms::DialogResult ergebnisEinzelTendDialog;
                EinzelTrendAnalyse^ EinzelTrendDialog = gcnew EinzelTrendAnalyse();
    
                ergebnisEinzelTendDialog = EinzelTrendDialog->ShowDialog();
    
                if (ergebnisEinzelTendDialog == System::Windows::Forms::DialogResult::OK)
                {
                   //*** Prüfen wieviele Produktionslose in der Angegebenen Zeit hergestellt wurden
                   //-->Datenbankabfrage
                   Loszahl = 20;  //*** Vorgabewert bis Datenbank steht
                   if (Loszahl < EinzelTrendDialog->numericUpDown1->Value)
                   {
                      MessageBox::Show("Im angegebenen Zeitraum wurden weniger Lose hergestellt als gewünscht.", "Programminformation");
                   } 
                   else if (Loszahl > EinzelTrendDialog->numericUpDown1->Value)
                   {
                      MessageBox::Show("Im angegebenen Zeitraum wurden mehr Lose hergestellt als gewünscht.\n Die Loszahl wird entsprechend verringert.", "Programminformation");
                      Loszahl = Convert::ToInt32(EinzelTrendDialog->numericUpDown1->Value);
                   }
                   else if (Loszahl == 0)
                   {
                      MessageBox::Show("Im angegebenen Zeitraum wurden keine Lose des gewählten Typs produziert.\n Versuchen Sie einen anderen Zeitraum oder einen anderen LS-Code.", "Programminformation");
                      this->Close();
                   }
    
                   ProdLos = gcnew array<LSProduktionslos>(Loszahl));               MessageBox::Show(Convert::ToString(ergebnisEinzelTendDialog)); //*** Wird angezeigt
                   //*** Daten aus Datenbank in Array einlesen
    
                   MessageBox::Show(Convert::ToString(ergebnisEinzelTendDialog) + "   VOR"); //*** Wird angezeigt
    
                   ProdLos[0]->Gesamt = 300;                                      //*** Hier scheint das Problem zu sein
    
                   MessageBox::Show(Convert::ToString(ergebnisEinzelTendDialog) + "   NACH"); //*** Wird NICHT angezeigt
                   MessageBox::Show(Convert::ToString(ProdLos[0]->Gesamt));       //*** Wird NICHT angezeigt
    

    Was mache ich falsch?



  • static ist hier nicht die Lösung - sondern übergib eine Referenz!



  • Würd ich ja machen wenn die eine Funktion von der anderen direkt aufgerufen würde.
    Aber es sind ja 2 eigene Ereignisbehandlungsroutienen.
    Oder sehe ich das falsch?

    N.B.: In diesen Code-Abschnitten ist nur die erste Funktion, in der das Array gefüllt werden soll abgebildet.
    Aber selbst das scheint ja so nicht zu funktioneieren.



  • Bevor ich lange Erkläre möchte ich die Situtaion klären.

    Besteht folgende Situation?

    ref class DeineKlasse
    {
    private:
       void eventHandler1(Object^ sender, EventArgs^ args)
       {
          // Hier die Daten laden
       }
    
       void eventHandler2(Object^ sender, EventArgs^ args)
       {
          // Hier die Daten verwenden
       }
    };
    

    Wobei DeineKlass natürlich anders heisst und auch eventHandler1 und 2 heissen vermutlich anders.



  • Nein, die EventHandler sind nicht bestandteil der Klasse.

    Die Klasse ist vielmehr ein eigener Variablentyp (ähnlich Struct), den ich halt für meine Zwecke benötige.

    Ich habe die Klasse an anderer Stelle bereits schon mal ähnlich verwendet.
    Mir ist allerdings mittlerweile aufgefallen das ich sie nicht ordnungsgemäß (über Verweise) ansprechen kann. (Denke ich jedenfalls.

    //***   Datenbanksimulation
       static int gesamtStk = 300;
    
       static LSProduktionslos EinzelProdLos;
    
       private: System::Void Einzellosbetrachtung_Load(System::Object^  sender, System::EventArgs^  e) 
                {
                   ...
                   EinzelProdLos.Gesamt = gesamtStk;
                   ...
                }
    

    Was mich an der Stelle wundert ist dass ich hier einen Punkt und keinen Pfeil verwenden muss.
    Wenn ich einen Pfeil benutze wird zwar meldungsfrei kompiliert, funktionieren tuts aber dann nicht mehr. (Verhält sich dann ähnlich wie in dem Array-Fall.



  • Nein, die EventHandler sind nicht bestandteil der Klasse.

    Ok, dann musst Du Referenzen übergeben - nicht globale / statische Variablen dafür verwenden!



  • Kannst du mir bitte erklären (vielleicht anhand eines kurzen Beispiels) wie und vo wo ich die Referenz übergeben soll.

    Da die beiden Events sich nicht gegenseitig aufrufen kann ich das noch nicht wirklich nachvollziehen.



  • Vom Prinzip her so:

    // Test.cpp : main project file.
    
    #include "stdafx.h"
    
    using namespace System;
    
    ref class MeineKlasse
    {
    public:
        MeineKlasse()
        {
            daten_ = gcnew array<Object^>(3);
        }
    
        void onEventHandler(Object^ /*sender*/, EventArgs^ /*args*/)
        {
            // Hier die Daten abfüllen
            daten_[0] = 30;
            daten_[1] = 40;
            daten_[2] = 50;
        }
    
        property array<Object^>^ Daten
        {
            array<Object^>^ get()
            {
                return daten_;
            }
        }
    
    private:
        array<Object^>^ daten_;
    };
    
    ref class DeineKlasse
    {
    public:
        DeineKlasse(MeineKlasse^ meineKlasse)
            : meineKlasse_(meineKlasse)
        { }
    
        void onEventHandler(Object^ /*sender*/, EventArgs^ /*args*/)
        {
            // Hier die Daten benutzen
            for each (Object^ object in meineKlasse_->Daten)
            {
                Console::WriteLine(object);
            }
        }
    
    private:
        MeineKlasse^ meineKlasse_;
    };
    
    int main(array<System::String ^> ^args)
    {
        MeineKlasse^ meineKlasse = gcnew MeineKlasse();
        DeineKlasse^ deineKlasse = gcnew DeineKlasse(meineKlasse);
    
        // Hier werden die Event Handler als Test manuell aufgerufen
        meineKlasse->onEventHandler(nullptr, nullptr);
        deineKlasse->onEventHandler(nullptr, nullptr);
    
        return 0;
    }
    

    Edit: Natürlich sind deine Daten anders (array<LSProduktionslos>) und deine Handler etc. heissen anders.



  • Problem gelöst 🙂 🙂
    Danke für deine Hilfeansätze, aber die Lösung war eigentlich viel einfacher.
    Anfängerfehler halt... 🙄

    Folgendermaßen funktioniert's:

    array<LSProduktionslos^>^ ProdLos;
    
    private: System::Void EinzelcodeTrendbetrachtung_Load(System::Object^  sender, System::EventArgs^  e) 
             {
                   {......}               
    
                   ProdLos = gcnew array<LSProduktionslos>(Loszahl)); 
    
                   for (int i = 0; i < Loszahl; i++)
    	           { 
    		         ProdLos[i] = gcnew LSProduktionslos();
    	           }
    

    Trotzdem vielen Dank für die Mühen


Anmelden zum Antworten