State.Contains(gdFixed) in DBGrid



  • Hallo zusammen,

    ich versuche gerade das Aussehen eines DBGrids zu verändern. Klappt auch alles ganz gut im Datenteil.

    Mein Problem: ich möchte in der Titelzeile in das Sortierfeld eine Grafik einbinden.

    Ich habe aber keine Möglichkeit in diese fixierten Zellen zu gelangen. Nach BCB-Hilfe sollte das über State.Contains(gdFixed) gehen, aber OHNE Erfolg.

    Hat jemand von euch einen Vorschlag?

    vielen Dank
    MG



  • Hallo

    du must den OnDrawColumnCell-Event benutzten.
    Dann kannst du abfragen, ob gerade eine feste Zelle gezeichnet wird.

    bis bald
    akari



  • Ich benutze den OnDrawColumnCell-Event.

    Aber der gdFixed-Ereigniss tritt nicht ein. (Hab es mit einer MSG-Box probiert), Aber seht selbst:

    void __fastcall TFormularMainData::GridMainViewDrawColumnCell(TObject *Sender,
          const TRect &Rect, int DataCol, TColumn *Column,
          TGridDrawState State)
    {
       if (State.Contains(gdSelected))  {
          GridMainView->Canvas->Brush->Color = clNavy;
          GridMainView->Canvas->Font->Color = clCream;
       }
    
       if (State.Contains(gdFixed))  {
          Application->MessageBox("gdFixed","msg",MB_OK);
    
       }
    }
    

    Der Teil mit "gdSelected" funktioniert!!!

    Gruß MG



  • TStringGrid verwenden?!

    http://community.borland.com/article/0,1410,20845,00.html

    schonmal gegoogelt? gibts unzählige seiten zu dem thema!



  • Mit StringGrid funktioniert ja alles perfekt! 😃

    😡 Es funktioniert NICHT im DBGrid!!! 😡

    Die VErwendung der einzelnen Komponenten sind mir schon bekannt 😉

    Gruß MG



  • Ausgehend von diesem Newsgroup-Beitrag musst du von TDBGrid ableiten, die DrawCell-Methode überschreiben und dort nach Bedarf die DrawFixedCell-Methode aufrufen.



  • @Jansen,

    hast du schon einmal so eine Methode überschrieben. Ich hab jetzt eine Stunde hin und her probiert - Aber alles schein nicht zu funktionieren. 😞 😞

    Hast du da einen Code-Ansatz für mich? 🙄

    Vielen Dank
    MG



  • Du musst die Komponente ableiten und dort die entspr. Funktion überschreiben!

    P.S. zeig erstmal Deinen Code-Ansatz



  • Hi,

    hier mein Versuch:

    Ich habe die Dateien Grid.hpp und DBGrids.hpp aus dem include-Verzeichnis des BCB in mein Projektverzeichnis kopiert.

    Dann habe ich in der Datei Grid.hpp die OnDrawCell-Funktion erweitert.
    Vorher:

    protected:
    	DYNAMIC void __fastcall ColumnMoved(int FromIndex, int ToIndex);
    	virtual void __fastcall DrawCell(int ACol, int ARow, const Types::TRect &ARect, TGridDrawState AState);
    	DYNAMIC AnsiString __fastcall GetEditText(int ACol, int ARow);
    	DYNAMIC void __fastcall SetEditText(int ACol, int ARow, const AnsiString Value);
    	DYNAMIC void __fastcall RowMoved(int FromIndex, int ToIndex);
    

    Nachher:

    protected:
    	DYNAMIC void __fastcall ColumnMoved(int FromIndex, int ToIndex);
    	virtual void __fastcall DrawCell(int ACol, int ARow, const Types::TRect &ARect, TGridDrawState AState); {
                if (AState.Contains == gdFixed) and Assigned(fOnDrawFixedCell) {
                   fOnDrawFixedCell(Self, ACol, ARow, ARect, AState );
                }
             }
    	DYNAMIC AnsiString __fastcall GetEditText(int ACol, int ARow);
    	DYNAMIC void __fastcall SetEditText(int ACol, int ARow, const AnsiString Value);
    	DYNAMIC void __fastcall RowMoved(int FromIndex, int ToIndex);
    

    Aber das funktioniert leider nicht. Kann mir jemand helfen, da ich noch nie irgendwelche Klassen abgeleitet habe und mir dazu (denk ich mal und wird auch so sein 🙂 ) das nötige Grundverständnis fehlt. Dieses Lücke möchte ich aber gern schließen und brauch dazu eure Hilfe!!!

    1000 Dank
    MG



  • Hallo

    1. auf keinen Fall die Original-Dateien verändern!
    2. zum Entwickeln von Komponenten kannst du hier nachlesen
    http://bcb-tutorial.c-plusplus.net/index_old.html
    allerdings solltest du vorher OOP-Grundlagen besitzen.

    bis bald
    akari



  • Hallo,

    ich habe das Problem jetzt anders gelöst:
    Um eine kleine Grafik in den festen Teil des DBGrids einzufügen, prüfe ich im DrawColumnCell-Event die erste Datenreihe und schreibe das Bild dann nicht mit top = rect.top sondern mit einem festen Wert "2".

    ABER SEHT SELBST:

    if (Column->FieldName == sort_field && MainView->RecNo == 1)
    		{
    			if (sort_desc > 0)	{
    			   GridMainView->Canvas->Draw(Rect.Left+Rect.Width()-Master->SortDESC->Width-1, 2, Master->SortDESC->Picture->Graphic);
                		}
    			else {
    			   GridMainView->Canvas->Draw(Rect.Left+Rect.Width()-Master->SortASC->Width-1, 2, Master->SortASC->Picture->Graphic);
                			}
    		}
    

    👍 DANKE FÜR JEGLICHE HILFE VON EUCH 👍

    Viele Grüße
    MG


Log in to reply