Farbe bei einer PickList eines DBGrids einstellbar?



  • Hallo Forum,

    gibt es eine Möglichkeit bei der Eigenschaft PickList eines DBGrids die Text-/Hintergrundfarbe einzustellen?

    Der Kern des Programms ist wie folgt aufgebaut:
    in einem DBGrid habe ich einer Spalte eine Pickliste zugeordnet. Wenn ich auf eine Zelle dieser Spalte klicke, öffnet sich eine DropDownliste (=Pickliste) aus der ich einen Eintrag wählen kann.

    TStringList* myPickList = new TStringList; //StringList wird mit Strings aus Abfrage eines Datenfeldes befüllt
    ..
    //ich weise die StringList der Eigenschaft PickList i d 3.Spalte zu 
     DBGrid1->Columns->Items[2]->PickList = myPickList;
     DBGrid1->Columns->Items[2]->DropDownRows = 15;
    .. 
    delete myPickList;
    ..
    


  • Hi, dies ist so ohne weiteres nicht direkt möglich.
    Ich habe mal in den Source von TDBGrid geschaut, wo die ComboBox gefüllt und angezeigt wird.
    Intern wird die Klasse TDBGridInplaceEdit dafür verwendet und diese initialisiert die Farbe und den Font für die angezeigte PickList aus den Standardwerten der Klasse selbst:

    FPickList.Color := Color;
    FPickList.Font := Font;
    FPickList.Items := Column.Picklist;
    

    Mittels TDBGrid::InplaceEditor kommst du jedenfalls schon mal an dieses Objekt heran. Du müßtest jetzt nur noch Zugriff auf die geschützten Eigenschaften Color und Font erhalten.
    Ich benutze dafür immer den folgenden Trick:

    class TMyInplaceEdit : public TInplaceEdit // Basisklasse von TDBGridInplaceEdit
    {
    public:
      void SetColor(TColor color) { Color = color; }
      void SetTextColor(TColor color) { Font->Color = color; }
    };
    
    TMyInplaceEdit *edit = static_cast<TMyInplaceEdit*>(DBGrid->InplaceEditor);
    edit->SetColor(clYellow);
    edit->SetTextColor(colRed);
    

    Dies ist aber ohne Garantie ...



  • Hallo Th, Danke für Deinen "Schnippsel"

    Habe ich natürlich sofort ausprobiert. Leider meckert der Compiler vom BCB6.
    [C++ Fehler] Unit1.cpp(52): E2247 Zugriff auf 'TCustomGrid::InplaceEditor' nicht möglich

    Macht nix. 😉 Trotzdem eine gute Idee das mit der abgeleiteten Klasse und TInplaceEdit.

    Ich habe mittlerweile anstelle der PickList eine DBLookupComboBox im Einsatz, bei der sich die Farben einstellen lassen.



  • OK, dann hast du ja einen anderen Weg gefunden.

    Man müßte bei meiner Methode dann auch noch von TDBGrid (bzw. TCustomGrid) ableiten (und casten), da InplaceEditor eine geschützte Eigenschaft ist.
    (aber der Zugriff auf die Farben ist anscheinend von den Machern nicht so gewollt gewesen, sonst hätten sie es ja direkt anbieten können - warum auch immer, oder niemand hat daran gedacht?).


Anmelden zum Antworten