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 netin 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
-
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!