TStringGrid: FixedRow anklicken?



  • Hallo,

    gibt es eine Möglichkeit, abzufangen, wenn der Benutzer in einem TStringGrid in eine Fixed-Cell klickt?

    Irgendwie wird da weder ein OnClick, noch SelectCell etc. ausgewählt. Ich möchte ähnlich wie in so manchem DBGrid die Inhalte unter Fixed-Cell x auf einen Klick sortieren.

    Die Suchfunktion und Hilfe haben mich leider auch nicht viel weiter gebracht.

    Danke,
    Mipe



  • OnMouseDown und MouseToCell?



  • hi,

    hier mal ein beispiel, wie ich das bei mir realisiert habe. wichtig ist, das du auf mousedown und mouseup reagieren musst, dann ist der rest ganz einfach.

    //---------------------------------------------------------------------------
    // h-file
    //---------------------------------------------------------------------------
    private:
      int clicked;
    
    //---------------------------------------------------------------------------
    // cpp-file
    //---------------------------------------------------------------------------
    
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
    {
      clicked = -1;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State)
    {
      TStringGrid *StringGrid = static_cast <TStringGrid*> (Sender);
    
      // bedingung prüfen und wenn gültig programm beenden
      assert(StringGrid != NULL);
    
      TCanvas* SGCanvas = StringGrid->Canvas;
      SGCanvas->Font    = StringGrid->Font;
    
      RECT RText = static_cast <RECT> (Rect);
    
      // text der jeweiligen spalte
      const AnsiString text(StringGrid->Cells[ACol][ARow]);
    
      // fixes zellen malen
      if (State.Contains(gdFixed))
      {
        SGCanvas->Brush->Color = clBtnFace;
        SGCanvas->Font->Color  = clWindowText;
        SGCanvas->FillRect(Rect);
    
        // wenn spalte geklickt wurde die farbe ändern um klick zu simulieren
        if (ACol == clicked) Frame3D(SGCanvas, Rect, clBtnShadow,    clBtnShadow, 1);
        else                 Frame3D(SGCanvas, Rect, clBtnHighlight, clBtnShadow, 1);
      }
      else
      {
        // markierte zellen malen
        if (State.Contains(gdSelected))
        {
          SGCanvas->Brush->Color = clHighlight;
          SGCanvas->Font->Color  = clHighlightText;
        }
    
        // alle anderen zellen
        else
        { 
          // standardfarben verwenden
          SGCanvas->Brush->Color = StringGrid->Color;
          SGCanvas->Font->Color  = StringGrid->Font->Color;
        }
      }
    
      // zeichenfläche löschen
      SGCanvas->FillRect(Rect);
    
      // text nicht ganz an den rand klatschen
      RText.left += 2;
    
      // zelle zeichnen (einzeilig und vertikal-zentriert)
      DrawText(SGCanvas->Handle, text.Trim().c_str(), text.Trim().Length(), &RText, DT_SINGLELINE | DT_VCENTER);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::StringGrid1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
    {
      int Row, Col;
    
      // mauskoordinaten ind zellenwerte umwandeln
      StringGrid1->MouseToCell(X, Y, Col, Row);
    
      // ereignis nur verarbeiten, wenn in zeile 0 und 
      // mit linker maustaste geklickt wurde
      if ((Row != 0) || !Shift.Contains(ssLeft)) return;
    
      // spalte merken
      clicked = Col;
    
      // stringgrid neuzeichnen
      StringGrid1->Invalidate();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::StringGrid1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
    {
      int Row, Col;
    
      // mauskoordinaten ind zellenwerte umwandeln
      StringGrid1->MouseToCell(X, Y, Col, Row);
    
      // wenn zeile != 0 dann abbruch
      if (Row != 0) return;
    
      // geklickte spalte wieder löscheb
      clicked = -1;
    
      // stringgrid neuzeichnen
      StringGrid1->Invalidate();
    
      // hier kannst du jetzt zum beispiel nen sortieralgorithmus hinpacken
      // oder sonstige verarbeitung mit der fixen zelle anstellen
    }
    //---------------------------------------------------------------------------
    

    ciao


Anmelden zum Antworten