Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Farbe in einem StringGrid bei "editieren".. (Done)


Terra23 - So 24.08.03 13:40
Titel: Farbe in einem StringGrid bei "editieren".. (Done)
Hi Leute.

Ich habe gerade an meinem Programm einige Veränderungen vorgenommen, damit u.a. die tristen Farben weg sind. Nun hat mein Programm als Farbe ein leichtes blau; das tut aber nichts zur Sache.

Wie dem auch sei, die StringGrids sind ebenfalls blau und einige haben die Eigenschaft "goEditing" auf True. Wenn ich in diesen Grids dann in eine Zelle klicke um den Wert einzutragen, wird diese jedoch weiss und das gefällt mir absolut nicht. Wie kann ich es ändern, daß bei Eintragung eines Wertes in ein solches Grid die jeweilige Zelle auch blau bleibt?

Im Forum bin ich irgendwie nicht sonderlich weit gekommen und EDH bietet mir da auch nichts wirklich brauchbares; aber vielleicht ja eine(r/s) von euch. ;-)


UGrohne - So 24.08.03 14:00

Du musst OnCellDraw irgendwie überschreiben und dort dann die Farbe vom Brush ändern, so in etwa. Schau vll. gleich mal nach :wink:


Terra23 - Do 28.08.03 14:29

Das klappt bei mir nicht. Wahrscheinlich habe ich zu wenig Ahnung davon.. :-(


ErnestoChe - Do 28.08.03 14:50

Hi,

schau mal

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
// Man muss im OnDrawCell die selektierte Zelle selber zeichnen. 
// You have to handle the OnDrawCell event and draw the selected cell yourself. 

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; 
  Rect: TRect; State: TGridDrawState); 
const 
  SelectedColor = Clblue; 
begin 
  if (state = [gdSelected]) then 
    with TStringGrid(Sender), Canvas do 
    begin 
      Brush.Color := SelectedColor; 
      FillRect(Rect); 
      TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Cells[aCol, aRow]); 
    end
end;

und noch

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; 
  Rect: TRect; State: TGridDrawState); 
var 
  dx: Integer; 
begin 
  with (Sender as TStringGrid) do 
  begin 
    // Don't change color for first Column, first row 
    if (ACol = 0or (ARow = 0then 
      Canvas.Brush.Color := clBtnFace 
    else 
    begin 
      case ACol of 
        1: Canvas.Font.Color := clBlack; 
        2: Canvas.Font.Color := clBlue; 
      end
      // Draw the Band 
      if ARow mod 2 = 0 then 
        Canvas.Brush.Color := $00E1FFF9 
      else 
        Canvas.Brush.Color := $00FFEBDF
      Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, cells[acol, arow]); 
      Canvas.FrameRect(Rect); 
    end
  end
end;


MFG

- Ernesto -


Terra23 - Do 28.08.03 15:16

Hey, vielen Dank Ernesto. Genau das, was ich gesucht habe. :-)

Viva La Revolution... ;-)


Terra23 - Do 28.08.03 16:59

... sorry für die vorschnelle Reaktion meinerseits. Gibt es irgendwo eine Liste mit den States?

Ich meine, gdSelected ist ja markiert (für diesen Zweck funktioniert es auch so wie es soll) doch nun bräuchte ich noch den State für "geklickt", sprich wenn man doppelt in eine Zelle klickt, damit die nicht weiß bleibt...


///Edit -> Schon gut. Hab's in der Hilfe gefunden. :oops: Nichts für Ungut.


kasi - Do 28.08.03 18:08

Das wird so einfach nicht funktionieren, da beim editieren ein Editor vom Typ TInplaceEdit erzeugt, welcher von TCustomMaskEdit abgeleitet ist. An diesen kommst du aber so ohne weiteres nicht ran. Du mußt eine Componente von TStringGrid ableiten und die Methode CreateEditor überschreiben.

z.B.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
  TMyStringGrid = class(TStringGrid)
    private
    protected
      function CreateEditor: TInplaceEdit; override

    public
    end;

....

function TMyStringGrid.CreateEditor: TInplaceEdit;
begin
 Result := inherited CreateEditor;
 TEdit(Result).Color := clRed;
end;

Einsatzbeispiel

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
   private
     MyStringGrid : TMyStringGrid;

....

procedure TForm1.FormCreate(Sender: TObject);
begin
MyStringGrid := TMyStringGrid.Create(Self);
MyStringGrid.Left := 488;
MyStringGrid.Top := 560;
MyStringGrid.Parent := Self;
MyStringGrid.OnDrawCell := StringGrid1DrawCell;
MyStringGrid.Options := MyStringGrid.Options + [goEditing];
end;


KASI


Terra23 - Do 28.08.03 20:43

Danke. Ggf. werde ich das mal probieren. Ich habe mich jetzt erstmal anders bemüht und einen ganz anderen Weg genommen als über das Färben. :-)