array von pointern auf TComboBox Elemente einer Form ?



  • Tach,

    ich bin noch relativ neu in dem Ganzen also bitte sachte :>

    ich habe eine Form1 mit ganz vielen ComboBoxen die alle nach folgendem schema benannt sind: box1, box2, box3, box4 .... boxN

    jetzt will ich jede box abfragen welches item ausgewählt ist, und je nach dem meine Form2 umformatieren ( Labels aktive edit felder etc pp )

    da ich aber nicht bei jeder funktion tausende zeilen code einbinden will
    hat ich mir das so vorgestellt dass ich mir n pointer array definiere dass auf die verschiedenen comboboxen zeigt ( die ja in der classe TForm selber als Pointer definiert sind ?! )

    vom prinzip her sowas:

    int Auswahl[5];
    TComboBox* Box[5]={Form1->Box1,Form1->Box2,Form1->Box3,Form1->Box4,Form1->Box5};
    for (int i=0;i<5;i++) {
    Auswahl[i] = Box[i]->ItemIndex;
    }
    

    auf die pointer wollt ich sowohl in form1 als auch in form2 zugreifen
    wenn ich jetzt aber das teil compiliere sagt er alles ok
    aber das prog kackt gleich ab bevor die form erscheint..

    is mein lösungsansatz total falsch ?

    ich hab erst gedacht ich könnte die boxen direkt irgenwie in ner schleife ansprechen ohne mir selber noch nen pointer array zu definieren ?
    sowas wie box'i' oder so.. aber das frisst er net

    in der hilfe hab ich vergeblich gesucht und google sagt auch weiss ich net

    😞

    gruß michael



  • Hallo

    grundsätzlich geht dein Ansatz, aber ich denke du greifts auf die ComboBoxen zu, bevor diese erstellt werden. Verleg die Initialisierung des Arrays in den Konstruktor des Forms, auch wenn das bedeudet, das du jede einzelne Zelle füllen must.

    bis bald
    akari



  • also ich bekomms nur hin wenn ich in jeder methode bzw funktion in der ich das pointer array benutze das array neu initialisiere

    dass ichs an einen punkt setze und alle funktionen drauf zugreifen können bekomm ich nich gebacken..
    habs in der classendefinition versucht (da sagt er klassenelement kann hier nich initialisiert werden) und bei

    __fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner){
    }

    (dann kennt er die pointer in den anderen fkten nicht)



  • Hallo,
    es gigt ein Ereignis bei TApplication, welches mir in solchem Fall weitergeholfen hat.
    "Das Ereignis OnActivate wird ausgelöst, wenn eine Anwendung aktiv wird.

    __property Classes::TNotifyEvent OnActivate = {read=FOnActivate, write=FOnActivate};

    Beschreibung

    Auf Basis von OnActivate können Sie eine Ereignisbehandlungsroutine programmieren, mit der Sie bei der Aktivierung der Anwendung bestimmte Aktionen durchführen können.

    Eine Anwendung wird aktiv, wenn sie ausgeführt wird oder der Fokus von einer anderen Windows-Anwendung zu einem beliebigen Fenster der Anwendung wechselt."

    So die Beschreibung aus der Hilfe. Im Code stellt sich das so dar:

    #include <vcl.h>
    #include <windows.h>
    #include <windowsx.h>                   // used for GET_WM_COMMAND_ID
    #include "Hauptform.h"
    
    #pragma hdrstop
    
    USERES("Project.res");
    USEFORM("Hauptform.cpp", HauptForm);
    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
    	HANDLE hToken;								// Handle für Prozesstoken
    	TOKEN_PRIVILEGES tkp;					// Zeiger auf die Tokenstruktur
    
    	try
    	{
    		Application->Initialize();
    		Application->CreateForm(__classid(THauptForm), &HauptForm);
                      Application->CreateForm(__classid(TForm1), &Form1);
                      Application->CreateForm(__classid(TForm2), &Form2);
                      Application->CreateForm(__classid(TForm3), &Form3);
    		Application->OnActivate	= HauptForm->AplActivate;
    		Application->Run();
    	}
    	catch (Exception &exception)
    	{
    		Application->ShowException(&exception);
    	}
      .
      .
      .
      .
    }
    
    // Hauptform.cpp
    // Die Applikation wird aktiviert
    void __fastcall THauptForm::AplActivate(TObject* Obj)
    {
    TComboBox* Box[5]={Form1->Box1,Form1->Box2,Form1->Box3,Form1->Box4,Form1->Box5};
    
    }
    

    Auf diese Weise sind alle Komponenten deiner Anwendung bereits initialisiert wenn du darauf zugreifen möchtest.

    Viel Erfolg


  • Mod

    Hallo

    zB in der *.h

    int eineVariable;

    in der .cpp
    __fastcall TForm1::TForm1(TComponent
    Owner)
    : TForm(Owner){
    {
    eineVariable = 10;
    }

    Bei Pointern funktioniert es genauso

    Mfg
    Klaus



  • hm, durchlaufe mit ComponentCount alle Componenten deiner Form und mach ein cast auf TComboBox, wenn es eine ist, kannst du die direkt ansprechen.

    beispiel:

    // alle Komponenten der Form durchlaufen
    for (int i = 0; i < Form1->ComponentCount; ++i)
    {
      if (Form1->Components[i]->ClassNameIs("TComboBox"))
      {
        TComboBox *Box = (TComboBox*) Form1->Components[i];
    
        if (Box)
        { 
          int Index = Box->ItemIndex;
        }
      }                   
    }
    


  • hi erst mal danke für die antworten.

    das mit dem componentcount is weng blöd weil ich 6 gruppen mit je 5 boxen habe

    ich hab jetzt im header der unit folgendes definiert:

    public:		// Anwender-Deklarationen
    
            typedef TComboBox* CBox;
            CBox    BoxenA[5],
                    BoxenB[5],
                    BoxenC[5],
                    BoxenD[5],
                    BoxenE[5],
                    BoxenF[5];
    

    jetzt dacht ich es würde einfach gehn die arrays so zu initialisieren:

    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    BoxenA={Box1,Box2,Box3,Box4,Box5};
    BoxenB={Box6,Box7,Box8,Box9,Box10);
    
    //BoxenA[5]={ ...}; hab ich auch probiert ?!
    //usw..
    
    }
    

    er akzeptierts aber nur wenn ich

    BoxenA[1]=Box1; 
    BoxenA[2]=Box2;
    //usw..
    

    mache. geht das mit der Liste nur beim initialisieren ?? oder wie lautet
    denn sonst die syntax dazu.

    gruß michael



  • Hallo

    ja, die Listendarstellung ist nur bei der Initialisierung möglich.
    Damit bleibt dir nur die direkte Zuweisung pro Zelle.

    bis bald
    akari



  • wie 6 gruppen? in groupboxen? die haben auch ein componentcount!

    bzw. vergibst du jeder box in der eigenschaft tag eine nummer die kannst du dann ebenfalls auswerten, wenn du eine box gefunden hast!


Anmelden zum Antworten