Zugriff auf GridPanel Zellen
-
Hallo alle zusammen,
ich hänge da mal wieder an einem kleinen Problem. Ich habe ein TGridPanel in einer TScrollBox. In diesem GridPanel welches per VCL-Designer schon mit 8 Rows angelegt wurde fülle ich mit folgendem Code mit einer variablen Anzahl von Spalten:
gplWeekplan->ColumnCollection->BeginUpdate(); for (int ActColumn = 0; ActColumn < NewColumns; ActColumn++) { gplWeekplan->ColumnCollection->Add(); gplWeekplan->ColumnCollection->Items[ActColumn]->SizeStyle = ssAbsolute; gplWeekplan->ColumnCollection->Items[ActColumn]->Value = 50; } gplWeekplan->ColumnCollection->EndUpdate();
Anschließend erzeuge ich zur Laufzeit Panels in den einzelnen Zellen des GridPanels;
gplWeekplan->ControlCollection->BeginUpdate(); for (int ActRow = 0; ActRow < gplWeekplan->RowCollection->Count; ActRow++) { for (int ActCol = 0; ActCol < gplWeekplan->ColumnCollection->Count; ActCol++) { TPanel *GridPanel = new TPanel(gplWeekplan); GridPanel->Parent = gplWeekplan; GridPanel->Align = alClient; GridPanel->AlignWithMargins = true; GridPanel->Margins->SetBounds(0, 0, 1, 1); GridPanel->BevelOuter = bkNone; GridPanel->ParentBackground = false; GridPanel->ShowCaption = false; gplWeekplan->ControlCollection->AddControl(GridPanel); } } gplWeekplan->ControlCollection->EndUpdate();
Dann wollte ich auf die einzelnen Zellen Zugreifen um in die Panels direkt eine Caption zu schreiben, oder dort je nach Bedarf
dynamisch Labels zu setzten. Versucht habe ich es mit folgendem Code.TControl *GridCell = gplWeekplan->ControlCollection->ControlItems[Column][Row]->Control; int Count = GridCell->ComponentCount;
Dabei müsste doch eigentlich als 'Count' eine 1 herauskommen, da ich doch jede Zelle schon mit einem Panel gefüllt habe.
Es kommt jedoch immer 0 heraus. Kann mir da jemand helfen wie ich an die Panels welche sich schon in dem GridPanel befinden
herankomme?Vielen Dank, Netzschleicher
-
Da du keinen Owner setzt, dürften deine dynamisch erzeugten 'GridPanels'(*) alle der Form gehören.
(*) Es ist recht verwirrend, Klasseninstanzen den Namen von existierenden anderen VCL-Klassen zu geben.
-
Ja, stimmt, die Namensgebung der Panels welche ich zur Laufzeit erzeuge ist sehr verwirrend, hab das in meinem Quellcode auch schon geändert.
Ich habe jetzt auch die Lösung wie ich an diese Panels wieder herankomme:
TControl *GridCell = gplWeekplan->ControlCollection->ControlItems[Column][Row]->Control; TPanel *CellPanel = dynamic_cast<TPanel*>(GridCell); if (CellPanel) { ... ... ... }
-
Nachdem ich jetzt den Zugriff, um in die einzelnen Zellen des GridPanels dynamisch Labels einzufügen und dort dann meine Daten hineinzuschreiben,
hinbekommen habe, gibt es jetzt aber die nächste Frage.In dem allem übergeordneten eingentlichen TGridPanel (gplWeekplan) habe ich mir ein 'OnDblClick' Ereignis im Designer erzeugt. Dort möchte ich bei einem Doppelklick
die Zeile und Spalte innerhalb des eigentlichen TGridPanels herausfinden und entsprechend dann weiterverarbeiten. Nur leider wird das OnDblClick-Ereignis nicht ausgelöst. Es funktioniert erst dann wenn ich den weiteren TPanels und TLabels, welche in dem übergeordneten TGridPanel eingefügt sind jeweils eine solche Ereignismethode übergebe.Also:
gplWeekplan->ControlCollection->BeginUpdate(); for (int ActRow = 0; ActRow < gplWeekplan->RowCollection->Count; ActRow++) { for (int ActCol = 0; ActCol < gplWeekplan->ColumnCollection->Count; ActCol++) { TPanel *CellPanel = new TPanel(gplWeekplan); CellPanel->Parent = gplWeekplan; CellPanel->Align = alClient; CellPanel->AlignWithMargins = true; CellPanel->Margins->SetBounds(0, 0, 1, 1); CellPanel->BevelOuter = bkNone; CellPanel->ParentBackground = false; CellPanel->ShowCaption = false; CellPanel->OnDblClick = WeekplanCellDblClick; // << hier die Angabe der Methode gplWeekplan->ControlCollection->AddControl(CellPanel); } } gplWeekplan->ControlCollection->EndUpdate();
und die DblClick Methode:
void __fastcall TForm1::WeekplanCellDblClick(TObject *Sender) { int ActIndex = gplWeekplan->ControlCollection->IndexOf((TControl*)Sender); if (ActIndex > -1) { int ActRow = gplWeekplan->ControlCollection->Items[ActIndex]->Row; int ActColumn = gplWeekplan->ControlCollection->Items[ActIndex]->Column; Label2->Caption = "Column : " + IntToStr(ActColumn); // dient nur zur Überwachung wärend der Entwicklung Label3->Caption = "Row : " + IntToStr(ActRow); // dient nur zur Überwachung wärend der Entwicklung } }
gibt es eine Möglichkeit dieses OnDblClick-Ereignis des übergeordneten TGridPanels zu aktivieren ohne für jedes eingefügte TPanel bzw. TLabel dieses Ereignis setzen zu müssen?
Grüße Netzschleicher
-
Nein, es geht nicht anders. OnClick und OnDblClick werden immer nur für das konkrete Control ausgelöst (niemals automatisch für dessen Parent- bzw. Child-Controls).
-
Schade, aber das habe ich mir fast schon gedacht. Trotzdem vielen Dank. Dann weis ich jetzt in welche Richtung ich Weiterentwickeln muß.