TComboBox zur Laufzeit generiert



  • Hallo,

    ich habe in meiner Applikation ein TStringGrid und möchte eine TComboBox anzeigen, wenn auf Spalte 3 geclickt wird, das hab' ich mit folgendem Code realisiert:

    TComboBox *temp_CB=NULL;
        if( Reftab_SG->Col != 3)
          {
          ModeHinweis_Mem->Hide();  // HinweisPanel für Mode verstecken
          if (temp_CB)
            {
            temp_CB->Visible=false;
            delete temp_CB; temp_CB=NULL;
            }
          }
        else
          {
          ModeHinweis_Mem->Show(); // HinweisPanel für Mode anzeigen
          if (lan)
            {
            ModeHinweis_Mem->Lines->Add("Mode:");
            ModeHinweis_Mem->Lines->Add("");
            ModeHinweis_Mem->Lines->Add("Bit 1&0: 0=Gesch.mode, 1=absolut Pos. mode, 2=relativ Pos. mode");
            ModeHinweis_Mem->Lines->Add("Bit 4: 1=Absolute Zeit(gesamter Fahrauftrag), 0=Zeit nach Fahrauftrag");
            ModeHinweis_Mem->Lines->Add("Bit 5: 1=Stop nach diesem Fahrauftrag, 0=fortsetzen bei nächstem Fahrauftrag");
            }
          else
            {
            ModeHinweis_Mem->Lines->Add("Mode:");
            ModeHinweis_Mem->Lines->Add("");
            ModeHinweis_Mem->Lines->Add("Bit 1&0: 0=Speedmode, 1=absolute Pos. mode, 2=relative Pos. mode");
            ModeHinweis_Mem->Lines->Add("Bit 4: 1=Absolute Time(whole mov. Cmd), 0=Time after mov. Cmd");
            ModeHinweis_Mem->Lines->Add("Bit 5: 1=Stop after this mov. Cmd, 0=Continue with next mov. Cmd");
            }
          if (temp_CB)  // existierende ComboBox löschen
            {
            temp_CB->Visible=false;
            delete temp_CB; temp_CB=NULL;
            }
          temp_CB=new TComboBox(this);
          temp_CB->Parent=Referenz_Pnl;
          temp_CB->Style=csDropDownList;
          temp_CB->OnChange = temp_CBChange;
          temp_CB->Left=Reftab_SG->Left;
          temp_CB->Height=Reftab_SG->DefaultRowHeight;
          temp_CB->Top=Reftab_SG->Top;
          temp_CB->Visible=true;
          temp_CB->Items->Add("Bit 1&0: 0=Speedmode, 1=absolute Pos. mode, 2=relative Pos. mode");
          temp_CB->Items->Add("Bit 4: 1=Absolute Time(whole mov. Cmd), 0=Time after mov. Cmd");
          temp_CB->Items->Add("Bit 5: 1=Stop after this mov. Cmd, 0=Continue with next mov. Cmd");
          /*** [Code for positioning] ***/
          TRect Rect = Reftab_SG->CellRect(Reftab_SG->Col,Reftab_SG->Row);
          temp_CB->Top = Reftab_SG->Top;
          temp_CB->Left = Reftab_SG->Left;
          temp_CB->Text = EmptyStr;
          temp_CB->Top = temp_CB->Top + Rect.Top + Reftab_SG->GridLineWidth;
          temp_CB->Left = temp_CB->Left + Rect.Left + Reftab_SG->GridLineWidth;
          temp_CB->Height = (Rect.Bottom - Rect.Top);
          temp_CB->Width = (Rect.Right - Rect.Left) + 2;
          temp_CB->Visible = true;
          temp_CB->SetFocus();
          /*** [/Code for positioning] ***/
          }
    

    Nach mir, sollte das so funktionieren, die ComboBox erscheint bei click auf Zeile 3 auch ganz sauber, aaaaaaaaber sie verschwindet nicht mehr, troz temp_CB->Visible=false; wesshalb? Was hab' ich da übersehen?
    Danke!



  • ah ist ja logisch, ich muss die Variable als private global in der Klasse deklarieren, sorry für eure Zeitverschwendung



  • Hallo

    roN schrieb:

    ah ist ja logisch, ich muss die Variable als private global in der Klasse deklarieren, sorry für eure Zeitverschwendung

    hehe, lustiger Fehler. Ist mir aber auch schon passiert. Übrigens nennt man das nicht global in der Klasse, sondern Member der Klasse, nur so um saubere Bezeichnungen zu verwenden.

    bis bald
    akari


Anmelden zum Antworten