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 Zellenfärben mit 3D-Effekt (https://www.delphipraxis.net/118533-stringgrid-zellenfaerben-mit-3d-effekt.html)

Stecky2000 9. Aug 2008 20:39


StringGrid Zellenfärben mit 3D-Effekt
 
Hallo Ihr Buben,

ich hoffe der Beitrag erscheint jetzt nicht zweimal.
Wenn doch, bitte einen löschen.

Also, ich möchte in einem StringGrid Zellen einfärben, eigentlich ganze Zeilen, ist auch egal.
Geht alles mit Ownerdraw, schon gemacht.

Das Problem ist, sie sollen nicht nur die Farbe der Spalten- bzw. Reihenköpfe haben, sondern auch deren 3D-Effekt.

Also quasi Zeilenköpfe mitten im StringGrid.
Hat da jemand einen Tipp?

toms 9. Aug 2008 20:42

Re: StringGrid Zellenfärben mit 3D-Effekt
 
Hallo

Wenn du die Eigenschaft FixedRows änderst, werden weitere Zeilen auch wie der Kopf angezeigt.
Oder möchtest du nur einzelne Zeilen in 3D darstellen?

Stecky2000 9. Aug 2008 20:44

Re: StringGrid Zellenfärben mit 3D-Effekt
 
Ja, genau, ich möchte z.B. jede vierte Zeile so darstellen.

ich wollte halt nicht 5 StringGrids mit Spaltenkopf (fixedRow) untereinander setzen sondern alles in einem.

Ich habe in der Delphi Hilfe was gelesen, dass bei FixedCols/FixedRows die Eigenschaft CTL3D auf True gesetzt wird, eben für die Zeile/Spalte 0,
nur finde ich nicht raus, wie ich das für eine andere beliebige Zeile/Spalte mache.

Lannes 9. Aug 2008 22:04

Re: StringGrid Zellenfärben mit 3D-Effekt
 
Hallo,

Fixed kann man nur in den ersten Spalten bzw. Zeilen setzen, also da bleibt Dir nichts anderes übrig als selber zu zeichnen in OnDrawCell.

Der folgende Code zeichnet einen 3D-Effekt über zwei Zellen in Spalte 2 + 3 in der 2-ten Zeile:
Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var aRect : TRect;
begin
  if (ACol in [2,3]) and (ARow = 2) then
    begin
    aRect := Rect;
    if ACol = 2 then
      aRect.Right := aRect.Right + StringGrid1.ColWidths[3]
      else
        aRect.Left := aRect.Left - StringGrid1.ColWidths[2];
    DrawFrameControl(StringGrid1.Canvas.Handle,aRect,DFC_BUTTON,DFCS_BUTTONPUSH);
    end;
end;

Stecky2000 9. Aug 2008 22:53

Re: StringGrid Zellenfärben mit 3D-Effekt
 
Super, das funktioniert.

Vielen Dank erstmal. Hab schon alles durchgegoogelt was geht, finde nirgens was.

Es sieht zwar nicht ganz so aus, wie die FixedCols/Rows, aber es geht.
Bei den "echten" FixedRows/Cols sind die Zwischenlinien schwarz, statt grau.

Lässt sich das auch noch rein bringen?


Ich will nicht unverschämt sein muss aber fragen weil weder die Begriffe:

- DrawFrameControl
- DFC_BUTTON
- DFCS_BUTTONPUSH

in meiner Delphi 5 Hilfe zu finden sind!!!


EDIT: Sorry, hab gefunden, es handelt sich um eine Windows API Funktion, die ist in der Delphi Hilfe nicht drin und es geht wohl auch nicht besser.
Deshalb nochmal, Danke!

Lannes 10. Aug 2008 00:19

Re: StringGrid Zellenfärben mit 3D-Effekt
 
Hallo,

versuch das mal:
Delphi-Quellcode:
if (ACol in [2,3]) and (ARow = 2) then
    begin
    aRect := Rect;
    if ACol = 2 then
      aRect.Right := aRect.Right + StringGrid1.ColWidths[3]
      else
        aRect.Left := aRect.Left - StringGrid1.ColWidths[2];
    //DrawFrameControl(StringGrid1.Canvas.Handle,aRect,DFC_BUTTON,DFCS_BUTTONPUSH);
    StringGrid1.Canvas.Brush.Color := StringGrid1.FixedColor;
    StringGrid1.Canvas.FillRect(aRect);
    DrawEdge(StringGrid1.Canvas.Handle,aRect,BDR_RAISEDINNER,BF_RECT);
    StringGrid1.Canvas.Brush.Color := clBlack;
    aRect.Right := aRect.Right+1;
    aRect.Bottom := aRect.Bottom+1;
    aRect.Top := aRect.Top-1;
    aRect.Left := aRect.Left-1;
    StringGrid1.Canvas.FrameRect(aRect);
    end;

toms 10. Aug 2008 06:14

Re: StringGrid Zellenfärben mit 3D-Effekt
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

Ich habe den Code noch etwas angepasst.
So wird nun jede 4. Zeile eine "Fixed Row".

Evtl sind weitere Optimierungen nötig.

Siehe Anhang für Resultat.

Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  TempRect: TRect;
begin
  if (ARow mod 4 = 0) then
    with TStringGrid(Sender) do
    begin
      TempRect := Rect;
      DrawFrameControl(Canvas.Handle, TempRect, DFC_BUTTON, DFCS_BUTTONPUSH);
      Canvas.Brush.Color := FixedColor;
      Canvas.FillRect(TempRect);
      DrawEdge(Canvas.Handle, TempRect, BDR_RAISEDINNER, BF_RECT);
      Canvas.Brush.Color := clBlack;

      with TempRect do
      begin
        if ACol = ColCount - 1 then
          Right := Right
        else
          Right := Right + 1;
        Bottom := Bottom + 1;
        Top := Top - 1;
        Left := Left - 1;
        Canvas.FrameRect(TempRect);
      end;
    end;
end;

Stecky2000 10. Aug 2008 08:21

Re: StringGrid Zellenfärben mit 3D-Effekt
 
Hey, einen schönen guten morgen Euch allen!

Mann Ihr seid ja der absolute Hammer! Manche scheinen sogar Gedanken lesen zu können.

Wenn ich den Code richtig verstehe ist die Erweiterung grundsätzlich im DrawEdge zu finden.
Genau das habe ich gestern gesucht aber nicht gefunden.

Ich habe da ein paar Probleme, dass ich z. T. die Delphi-Hilfe nicht nutzen kann.
Hab einen neuen PC mit Vista, hab zwar den Winhlp-patch, aber der behebt das Problem auch nicht 100%.

Wie auch immer, vielen Dank.
Ihr habt ja schon fast den fertigen code geliefert, das hab ich nicht erwartet, hilft mir aber die Zusammensetzung und Funktion zu verstehen.

Ich werde jetzt den kram einbauen und eine meine Funktionalität anpassen.

Ich danke Euch nochmals sehr. :-D

Lannes 10. Aug 2008 09:36

Re: StringGrid Zellenfärben mit 3D-Effekt
 
Hallo,

@toms: gibt es einen Grund vor DrawEdge und FillRect (übermalt doch alles mit FixedColor) noch DrawFrameControl einzusetzen?

toms 10. Aug 2008 16:29

Re: StringGrid Zellenfärben mit 3D-Effekt
 
Zitat:

Zitat von Lannes
Hallo,

@toms: gibt es einen Grund vor DrawEdge und FillRect (übermalt doch alles mit FixedColor) noch DrawFrameControl einzusetzen?

DrawFrameControl() kann weggelassen werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:25 Uhr.

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