Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Stringgrid spinnt (https://www.delphipraxis.net/45661-stringgrid-spinnt.html)

Raucherbein 10. Mai 2005 10:34


Stringgrid spinnt
 
hi leutz!

mir ist grad folgendes problem bei meiner arbeit aufgetaucht:

ich hab ein stringgrid, und im ondrawcell ereignis desselben prüfe ich, ob einzelne zellen leer sind oder nicht, und wenn etwas drin steht, dann soll er diese farblich blau zeichnen!

allerdings läuft da etwas schief! weil solange noch nichts drin steht, funktioniert das einwandfrei! sobald aber in einer zelle irgendwas steht, kann man die ganzen zellen dieser spalte durch anklicken blau färben!

das darf aber nicht sein!

die ersten beiden if funktionen färben zellen, deren kopf ein datum enthält farblich, sobald es zum we gehört!

Delphi-Quellcode:
procedure TfrmMain.grdAnzeigeDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  a : integer;
begin
  if (dayoftheweek(strtodate(grdAnzeige.Cells[acol, 0])) = 6) and not (gdFixed in State) then
  with grdAnzeige do
  begin
    Canvas.Brush.Color := $0000c3ff;
    Canvas.FillRect(Rect);
    Canvas.TextOut(Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]);
  end;                                         //färben des sonnabends

  if (dayoftheweek(strtodate(grdAnzeige.Cells[acol, 0])) = 7) and not (gdFixed in State) then
  with grdAnzeige do
  begin
    Canvas.Brush.Color := clred;
    Canvas.FillRect(Rect);
    Canvas.TextOut(Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]);
  end;                                         //färben des sonntages

  for a := 2 to grdAnzeige.RowCount do       //färben der zellen, wenn eintrag
  begin                                       //allerdings nur, wenn nicht zu
    if grdAnzeige.Cells[acol,a] <> '' then   //den oberen 2 zeilen gehört!
    with grdAnzeige do
    begin
      canvas.Brush.Color := clskyblue;
      canvas.FillRect(Rect);
      canvas.TextOut(rect.Left + 2, rect.Top + 2, cells[acol, arow]);
    end;
  end;
 
end;
woran liegt das? hat einer ne idee???


mfg matthias

Christian Seehase 10. Mai 2005 11:17

Re: Stringgrid spinnt
 
Moin Matthias,

erst einmal herzlich willkommen hier in der Delphi-PRAXiS.

Ob's hilft weiss ich nicht, aber Du könntest ja mal probieren nicht Cells[] <> '' sondern trim(Cells[]) <> 0 zu nehmen.

Jasocul 10. Mai 2005 11:22

Re: Stringgrid spinnt
 
Da du das im DrawCell machst, ist die Schleife am Schluss imho sinnlos.
Delphi-Quellcode:
procedure TfrmMain.grdAnzeigeDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  a : integer;
begin
  if (dayoftheweek(strtodate(grdAnzeige.Cells[acol, 0])) = 6) and not (gdFixed in State) then
  with grdAnzeige do
  begin
    Canvas.Brush.Color := $0000c3ff;
    Canvas.FillRect(Rect);
    Canvas.TextOut(Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]);
  end;                                         //färben des sonnabends

  if (dayoftheweek(strtodate(grdAnzeige.Cells[acol, 0])) = 7) and not (gdFixed in State) then
  with grdAnzeige do
  begin
    Canvas.Brush.Color := clred;
    Canvas.FillRect(Rect);
    Canvas.TextOut(Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]);
  end;                                         //färben des sonntages

//  for a := 2 to grdAnzeige.RowCount do      
//  begin                                      
    if grdAnzeige.Cells[acol,aRow] <> '' then   //STATT "a" "aRow" eingesetzt
    with grdAnzeige do
    begin
      canvas.Brush.Color := clskyblue;
      canvas.FillRect(Rect);
      canvas.TextOut(rect.Left + 2, rect.Top + 2, cells[acol, arow]);
    end;
//  end;
 
end;
Ob das allerdings dein Problem löst, habe ich jetzt nicht getestet. Kann aber gut sein, da du kein Else hast, wo du die Farben zurück setzt.

Raucherbein 10. Mai 2005 11:38

Re: Stringgrid spinnt
 
danke ersteinmal für die antworten!

zu #1: hab ich versucht, macht er trotzdem immernoch!

zu #2: die schelife ist nötig, damit die ersten beiden zeilen da nicht mit hineingezogen werden, da diese fixed sind, und daten enthalten! diese solln extra nicht verändert werden!


mfg matthias

marabu 10. Mai 2005 11:51

Re: Stringgrid spinnt
 
Hallo Matthias,

Delphi-Quellcode:
procedure TFrmMultiSearch.grdAnzeigeDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
var
  a: integer;
  d: TDate;
  cl: TColor;
begin
  d := StrToDate(grdAnzeige.Cells[aCol, 0]);
  if gdFixed in State then cl := grdAnzeige.FixedColor
  else if DayOfTheWeek(d) = 6 then cl := $0000c3ff
  else if DayOfTheWeek(d) = 7 then cl := clRed
  else if grdAnzeige.Cells[aCol, aRow] <> '' then cl := clSkyBlue
  else cl := clWhite;

  with grdAnzeige do
  begin
    Canvas.Brush.Color := cl;
    Canvas.FillRect(Rect);
    Canvas.TextOut(Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]);
  end;
end;
Grüße vom marabu

Noinini 10. Mai 2005 12:00

Re: Stringgrid spinnt
 
Hi Matthias,

die Lösung von Jasocul ist schon richtig, Du musst nur statt der Schleife eine Abfrage machen, dass die Zeile richtig ist:
Delphi-Quellcode:
procedure TfrmMain.grdAnzeigeDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  a : integer;
begin
  if (dayoftheweek(strtodate(grdAnzeige.Cells[acol, 0])) = 6) and not (gdFixed in State) then
  with grdAnzeige do
  begin
    Canvas.Brush.Color := $0000c3ff;
    Canvas.FillRect(Rect);
    Canvas.TextOut(Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]);
  end;                                         //färben des sonnabends

  if (dayoftheweek(strtodate(grdAnzeige.Cells[acol, 0])) = 7) and not (gdFixed in State) then
  with grdAnzeige do
  begin
    Canvas.Brush.Color := clred;
    Canvas.FillRect(Rect);
    Canvas.TextOut(Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]);
  end;                                         //färben des sonntages

//  for a := 2 to grdAnzeige.RowCount do      
//  begin  
    if aRow >= 2 then
    begin                              
      if grdAnzeige.Cells[acol,aRow] <> '' then   //STATT "a" "aRow" eingesetzt
      with grdAnzeige do
      begin
        canvas.Brush.Color := clskyblue;
        canvas.FillRect(Rect);
        canvas.TextOut(rect.Left + 2, rect.Top + 2, cells[acol, arow]);
      end;
    end;

end;
Viele Grüße

Iris


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz