Zeilenhöhe von DBGrid verändern?



  • Hallo, kann man die Zeilen höhe in einem DBGrid verändern?

    LG Michel



  • Hallo,

    Das TDBGrid ist von TCustomGrid abgeleitet. Es erbt von diesem die Eigenschaft RowHeights.

    BCB-3_Hilfe schrieb:

    Dieses Beispiel basiert auf einem Formular, das ein String-Gitter und eine Schaltfläche enthält. Wenn der Benutzer auf die Schaltfläche klickt,
    ändert sich die Anzahl der Spalten und Zeilen, und der ersten Spalte sowie der ersten Zeile wird eine andere Größe als den
    restlichen Spalten und Zeilen zugewiesen.

    void __fastcall TForm1::Button1Click(TObject *Sender)

    {
    DrawGrid1->ColCount = 7;
    DrawGrid1->RowCount = 11;
    DrawGrid1->RowHeights[0] = 35;
    DrawGrid1->ColWidths[0] = 90;
    }

    Das obige Bsp. ist logischerweise auch für ein DBGrid anwendbar.

    Aufschlussreich sind (für die Beantwortung derartiger Fragen wie deiner) die Komponenten-Hierarchie,
    die *.hpp-Dateien und die Sourcen der VCL.

    mfg
    kpeter

    edit/Ergänzung:

    Einziges Handicap an der ganzen Sache mit DBGrid ist, dass nicht ohne weiteres auf RowHeights zugegriffen werden kann.
    (RowHeights' is not accessible)

    Einfachste Lösung: dynamisches Erstellen des Gitters. Ist zunächst Schreibaufwand, aber das ist der Preis. 😉

    Minimal-Beispiel:

    *.h

    #include <DBGrids.hpp>
    
    class MyDBGrid : public TDBGrid
    {
    
    private:
    
    public:
       __fastcall MyDBGrid( TComponent* Owner );
       int  __fastcall GetRowHeights(int Index);
       void __fastcall SetRowHeights(int Index, int Value);
    
    __published:
       __property int RowHeights[int Index] = {read=GetRowHeights, write=SetRowHeights};
    
    };
    
    //In class Formular
    
    private:
       MyDBGrid* _DBGrid;
    
    public:
    
       __fastcall TForm1(TComponent* Owner);
       __fastcall ~TForm1(void);
    

    *.cpp:

    __fastcall MyDBGrid::MyDBGrid( TComponent* Owner ) : TDBGrid(Owner) {}
    //--------------------------------------------------------------------------
    
    int  __fastcall MyDBGrid::GetRowHeights(int Index)
    {
       return TDBGrid::RowHeights[Index];
    }
    //--------------------------------------------------------------------------
    
    void __fastcall MyDBGrid::SetRowHeights(int Index, int Value)
    {
       if (Value != TDBGrid::RowHeights[Index]) {
          TDBGrid::RowHeights[Index] = Value;	
       }
    }
    //---------------------------------------------------------------------------
    
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
       _DBGrid = new MyDBGrid(this);
       _DBGrid->Parent = Panel1;
       _DBGrid->Align = alClient;
       _DBGrid->DataSource = DataSource1;
       _DBGrid->Columns->Add();
       _DBGrid->Columns->Items[0]->FieldName = "Frage";
       _DBGrid->Columns->Add();
       _DBGrid->Columns->Items[1]->FieldName = "Punkte_max";
       _DBGrid->Columns->Add();
       _DBGrid->Columns->Items[2]->FieldName = "Punkte_ist";
    }
    //---------------------------------------------------------------------------
    
    __fastcall TForm1::~TForm1(void)
    {
       delete _DBGrid;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       _DBGrid->RowHeights[0] = 90;
       _DBGrid->RowHeights[1] = 70;
    }
    //---------------------------------------------------------------------------
    

    Ratsam ist, die Zeilenhöhe bei aktiver Connection zu setzen (wenn also Daten anliegen).



  • Hallo, vielen lieben Dank erstmal für die Mühe, das alles aufzuschreiben! Da ist auch alles gut verständlich 🙂

    Aber bevor ich das jetzt alles einbaue: Wie kann ich auf Ereignisse des DBGrids zugreifen, welchen ich dynamisch dann erzeuge?



  • Die Ereignisse sind Funktions-Pointer denen einen Wert/Funktion zugewiesen werden kann.



  • Hallo

    Siehe auch FAQ hier im BCB-forum, Abschnitt Komponenten benutzen, Thread zur Laufzeit erstellen, anzeigen und Events zuweisen.

    bis bald
    akari



  • Ja das habe ich verstanden. Eigentlich ganz simple 😃

    Kann ich denn das mit RowHeights dann auch für Spaltenbreite machen? so ala

    int  __fastcall MyDBGrid::GetColWidths(int Index) 
    { 
       return TDBGrid::ColWidths[Index]; 
    } 
    //-------------------------------------------------------------------------- 
    
    void __fastcall MyDBGrid::SetColWidths(int Index, int Value) 
    { 
       if (Value != TDBGrid::ColWidths[Index]) { 
          TDBGrid::ColWidths[Index] = Value;    
       } 
    }
    


  • Hallo

    Siehe TDBGrid::Columns::Items[]::Width

    bis bald
    akari



  • wie kann man den text im DBGrid in den feldern zentrieren? dazu habe ich noch nix gefunden ... beim stringgrid kann man ja hAlign mit angeben...



  • Zur Entwurfszeit Rechtsklick in das Grid, Spalteneditor im Popupmenü auswählen.

    Da kannst du alle/ausgewählte Spalten hinzufügen und bearbeiten.
    Werte der jeweiligen Spalte werden im Objektinspektor gesetzt, so auch die Textausrichtung.

    edit
    Ähm, du brauchst ja sicher den Laufzeitcode:

    zB

    DBGrid1->Columns->Items[1]->Alignment = taCenter;
    

Anmelden zum Antworten