einzelne Zellen in StringGrid deaktivieren?



  • Ist es möglich (wenn ja, wie?), einzelne verstreute Zellen in einem StringGrid zu deaktivieren? So, dass sie nicht beschreibbar sind?

    Mit Hilfe von DrawCell kann ich die Zellen, die nicht benötigt werden, grau hinterlegen, aber man kann immer noch etwas reinschreiben.

    Danke für eine Antwort.



  • Hallo

    siehe den Event TDrawGrid::OnSelectCell in der BCB-Hilfe.

    bis bald
    akari



  • Ich muss nochmal zu etwas Grundsätzlichem nachhaken:

    Wenn in der ersten Spalte, egal in welcher Zeile, "AS" eingegeben wird, soll die Zelle [3,2] grau hinterlegt werden. Wird das "AS" hingegen weggenommen, dann soll die Zelle wieder normal weiß gezeichnet werden.

    Ich habe es so versucht, aber es läuft nicht (das ist jetzt ein Delphi-Beispiel, aber das Prinzip ist mit dem Builder identisch):

    procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
    begin
        if (StringGrid1.Cells[1, ARow] = 'AS') then begin
        	with TStringGrid(Sender).Canvas do begin
           		if (ACol = 3) and (ARow = 2) then begin //hier geht nichts durch
                	Brush.Color:= clGray;
            		FillRect(Rect);
                end;
            end;
        end;
    end;
    


  • "Läuft nicht" ist keine ausreichende Problembeschreibung.

    //---------------------------------------------------------------------------
    void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
          int ARow, TRect &Rect, TGridDrawState State)
    {
      // Zelle [3,2] soll gezeichnet werden
      if (ACol == 3 && ARow == 2)
      {
        // also prüfen, ob irgendwo in Spalte 2 (gezählt wird von Null)
        // der gesuchte String steht
        if (StringGrid1->Cols[1]->IndexOf("AS") >= 0)
        {
          StringGrid1->Canvas->Brush->Color = clGray;
          StringGrid1->Canvas->Font->Color = clWhite;
          StringGrid1->Canvas->FillRect(Rect);
        }
      }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::StringGrid1SetEditText(TObject *Sender, int ACol,
          int ARow, const AnsiString Value)
    {
      // nach Texteingabe in der fraglichen Spalte dafür sorgen,
      // dass das Grid neugezeichnet wird
      if (ACol == 1)
        StringGrid1->Invalidate();
    
      // ein ähnlicher Aufruf ist notwendig, wenn das StringGrid
      // per Programm mit Text befüllt wird
    }
    //---------------------------------------------------------------------------
    


  • Hallo Jansen,

    das klappt ja schon ganz wunderbar, danke.

    Kannst du mir auch noch verraten, wie man es bewerkstelligt, dass nur die Zelle der jeweiligen Zeile, in der "AS" steht, geschwärzt wird?

    Beispiel:
    In Zeile 1/Spalte 1 steht AS, dann soll die 3. Zelle genau dieser Zeile geschwärzt werden.

    In Zeile 2/Spalte 1 steht kein AS, es soll nichts passieren.

    In Zeile 3/Spalte 1 steht wiederum AS, hier soll wieder in derselben Zeile die 3 Zelle geschwärzt werden.

    Ich habe das hier fertiggestellt, es werden auch die Zeilen abgefragt, die geschwärzte Zelle bleibt beim Wechsel der Zeile aber nicht stehen, sonder läuft immer mit. Es soll aber in jeder Zeile, in der AS steht, eine graue Zelle sein.

    void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State)
    {
    	// Zelle [3,2] soll gezeichnet werden
    	if (ACol == 3 && ARow == StringGrid1->Row)
    	{
    		// also prüfen, ob irgendwo in Spalte 1 der gesuchte String steht
    		//if (StringGrid1->Cols[1]->IndexOf("AS") >= 0)
    		if (StringGrid1->Cells[1][StringGrid1->Row] == "AS")
    		{
    			StringGrid1->Canvas->Brush->Color = clGray;
    			StringGrid1->Canvas->Font->Color = clWhite;
    			StringGrid1->Canvas->FillRect(Rect);
    		}
    	}
    }
    //---------------------------------------------------------------------------
    

    PS
    Gibts einen Unterschied zwischen Invalidate und Refresh?



  • Ingo schrieb:

    Kannst du mir auch noch verraten, wie man es bewerkstelligt, dass nur die Zelle der jeweiligen Zeile, in der "AS" steht, geschwärzt wird?

    Das ist aber eigentlich nur noch logisches Denken ...

    if (ACol == 3 && StringGrid1->Cells[1][ARow] == "AS")
      {
        StringGrid1->Canvas->...
      }
    

    Gibts einen Unterschied zwischen Invalidate und Refresh?

    Gibt es bestimmt. Schau doch mal in der Hilfe oder in den Sourcen nach.



  • Danke, Jansen!


Anmelden zum Antworten