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 Zelle unterschiedlich färben (https://www.delphipraxis.net/59674-stringgrid-zelle-unterschiedlich-faerben.html)

Logan 27. Dez 2005 02:06


Stringgrid Zelle unterschiedlich färben
 
Hallo,

ich habe folgendes Problem:
Ich möchte eine Zelle im Stringgrid in X-verschiedenen Farben füllen (für einen Terminplaner, je nach Anzahl der Benutzer). Weiss aber nicht, wie ich eine Zelle dem entsprechend teile.

Habe viel gesurft und leider nix gefunden :cry:
Also, bitte nicht schlagen, falls es hier schon einmal gefragt wurde :-D

Schon mal vielen Dank!!!

MfG
Logan

himitsu 27. Dez 2005 02:15

Re: Stringgrid Zelle unterschiedlich färben
 
DefaultDrawing auf False setzen (im OI)
und dann in OnDrawCell den Zelleninhalt selber zeichnen (Hintergrund + Text)

in der OH ist ein Beispiel zu finden (OH > OnDrawCell)


[add]
Ach ja ... Herzlich Willkommen ^^

Luckie 27. Dez 2005 03:04

Re: Stringgrid Zelle unterschiedlich färben
 
Heißt dass nicht OwnerDraw und muss auf True stehen?

Sharky 27. Dez 2005 07:49

Re: Stringgrid Zelle unterschiedlich färben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hai Logan,

ersteinmal : "Herzlich Willkommen in der Delphi-PRAXiS" :hi:

Bevor ich da jetzt groß etwas schreibe hänge ich lieber mein Demo in den Anhang. Es sollte eigentlich alles erklären können. :stupid:

himitsu 27. Dez 2005 09:07

Re: Stringgrid Zelle unterschiedlich färben
 
OwnerDraw is schonmal falsch ... dachte schon ich hätte mich geirrt ... böser Luckie, hattest mir schon fast Angst gemacht :shock:

Aber ich hab gerade nochmal nachgesehn:
DefaultDrawing muß nicht unbedingt auf Fals gesetzt werden ... nur weil man es bisher zufällig immer gemacht hatte, muß man ja auch nicht davon ausgehn, daß es immer so sein muß :oops:

Zitat:

Zitat von OH > DefaultDrawing
Hat DefaultDrawing den Wert true, werden die Zellen des Gitters automatisch angezeigt. Dazu wird die Hintergrundfarbe eingefügt, in die fixierten Zellen werden die 3D-Effekte eingefügt und das Fokusrechteck umgibt die ausgewählte Zelle. Wenn Sie DefaultDrawing auf false setzen, werden die Zellen nicht mit dem Gitter gezeichnet.

Hat DefaultDrawing den Wert false, sollten die Zellen mit der Methode DrawCell gezeichnet werden. Für ein TCustomGrid
-Objekt ist DrawCell eine abstrakte Methode. Die Nachkommen des TCustomGrid-Objekts verfügen mit DrawCell über eine eigene Zeichenmethode oder lösen das Ereignis OnDrawCell aus.


@Sharky:
wofür is eigentlich ExplicitLeft, ExplicitTop und ExplicitWidth?
(weder D7, noch D2005 kennen das)

Logan 27. Dez 2005 11:06

Re: Stringgrid Zelle unterschiedlich färben
 
Zitat:

Herzlich Willkommen ^^
Danke :)

Und auch vielen Dank für die Hilfe!!!

Logan 27. Dez 2005 11:29

Re: Stringgrid Zelle unterschiedlich färben
 
@Sharky:
Hmmm, bei der Demo bekomme ich 3 Fehler schon zu Beginn :(
Die ich ignorieren muss.
Ich nutze Delphi 2005, hat es was damit evtl. zu tuen?

Sharky 27. Dez 2005 11:33

Re: Stringgrid Zelle unterschiedlich färben
 
Zitat:

Zitat von Logan
... Ich nutze Delphi 2005, hat es was damit evtl. zu tuen?

Jup. Ignoriere die Fehler und speichere das Beispiel noch einmal in deiner D2005 Version.
Die drei genannten Propertys sind erst sein D2006 dabei. Und das Demo hatte ich dummerweise mal in einem D2006 geöffnet und wieder gespeichert.

Logan 27. Dez 2005 12:15

Re: Stringgrid Zelle unterschiedlich färben
 
In der Demo geht es aber nur drum Zellen einfarbig zu färben.
Soweit bin ich auch schon :)

Und in der Online-Hilfe finde ich leider kein Beispiel zu ?!

himitsu 27. Dez 2005 12:30

Re: Stringgrid Zelle unterschiedlich färben
 
schau mal unter CANVAS ... du kannst alle möglichen Zeichenoperationen da verwenden ;)

Sharky 27. Dez 2005 12:39

Re: Stringgrid Zelle unterschiedlich färben
 
Zitat:

Zitat von Logan
In der Demo geht es aber nur drum Zellen einfarbig zu färben.

:wall: Ich sollte genauer lesen :oops:

Sollen die Zellen nur farbig sein oder auch Text enthalten?

himitsu 27. Dez 2005 12:45

Re: Stringgrid Zelle unterschiedlich färben
 
nich trauchig sein, du hast es doch gut gemacht ... dort steht ja drin, wie man zeichnet und den Text reinmacht, also alles, was man braucht, dieses müß jetzt halt nur noch angepasst werden ;)

Zusammenfassung aus deiner Demo:
Delphi-Quellcode:
// Hintergrund zeichnen
Canvas.Brush.Color := clGreen;
Canvas.FillRect(Rect);
// Textausgeben
DrawText(Canvas.Handle, PChar(celltext), Length(celltext), Rect, DT_SINGLELINE);

Logan 27. Dez 2005 12:51

Re: Stringgrid Zelle unterschiedlich färben
 
Zitat:

Sollen die Zellen nur farbig sein oder auch Text enthalten?
In der Jahresansicht soll es nur farbig sein, und in den anderen Ansichten Text und farbig :)

Sharky 27. Dez 2005 12:53

Re: Stringgrid Zelle unterschiedlich färben
 
Hai (b)engelchen.

Ich glaube Du hast auch nicht richtig gelesen. Er möchte ja in einer Zelle mehr als eine Farbe.

Hier mal ein Demo für eine zweifarbige Zelle (horizontal geteilt):
Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: integer;
  Rect: TRect; State: TGridDrawState);
var
  celltext: string;
  myDrawRect: TRect;
  rowHeight: integer;
begin
  with (Sender as TStringGrid) do
  begin
    celltext := Cells[ACol, ARow];
    myDrawRect := Rect;
    SetBkMode(StringGrid1.Canvas.Handle,OPAQUE);
    if (ARow = 2) and (ACol > 0) then // Hier ist es zweifarbig
    begin
      Canvas.Brush.Color := clRed;
      rowHeight := RowHeights[ARow];
      myDrawRect.Bottom := myDrawRect.Bottom - (rowHeight div 2);
      Canvas.FillRect(myDrawRect); // Hintergrund für die obere Hälfe zeichnen

      Canvas.Brush.Color := clBlue;
      myDrawRect.Bottom := Rect.Bottom;
      myDrawRect.Top := myDrawRect.Top + (rowHeight div 2);
      Canvas.FillRect(myDrawRect); // Hintergrund für die untere Hälfe zeichnen
      SetBkMode(StringGrid1.Canvas.Handle, TRANSPARENT); // Den Hintergrund nich überschreiben
    end;
    if (ARow = 3) then // Einfarbige Zeilen
    begin
      Canvas.Brush.Color := clGreen;
      Canvas.FillRect(Rect);
    end;
    DrawText(Canvas.Handle, PChar(celltext), Length(celltext),Rect, DT_SINGLELINE);
  end;
end;

Logan 27. Dez 2005 13:02

Re: Stringgrid Zelle unterschiedlich färben
 
Oha, genau sowas meinte ich, vielen lieben Dank für die Hilfe und sorry falls ich mich unverständlich ausgedrückt habe :oops:

Super Forum!!!

Sharky 27. Dez 2005 13:11

Re: Stringgrid Zelle unterschiedlich färben
 
Zitat:

Zitat von Logan
... und sorry falls ich mich unverständlich ausgedrückt habe

Du kannst ja nichts dafür wenn ich nicht richtig lesen kann. Es war schon genau beschrieben was Du wolltest.

Zitat:

Super Forum!!!
Das hören wir immer gerne. Danke :-D

So, nur um sicher zu sein:
Hast Du auch verstanden wass ich da im Code mache?

Logan 27. Dez 2005 13:18

Re: Stringgrid Zelle unterschiedlich färben
 
Verstanden schon, mir geht es ja nicht um Copy & Paste, will ja schliesslich was lernen :)

In meinen Augen is der Schlüssel genau hier:

myDrawRect.Bottom := myDrawRect.Bottom - (rowHeight div 2); //<---Genau das
SetBkMode(SG_Jahre.Canvas.Handle, TRANSPARENT);

:cheers:

Sharky 27. Dez 2005 13:29

Re: Stringgrid Zelle unterschiedlich färben
 
Genau.

Man hat ja in der Variablen Rect die genaue Position der Zelle die gerade gezeichnet wird. Also berechne ich einfach die Position wenn der Bereich denn ich färben möchte nur halb so hoch ist wie die Zelle.

Das mit dem SetBkMode ist notwendig um bei der Textausgabe den Hintergrund nicht mit der aktuelle Brush.Color zu überschreiben.

himitsu 27. Dez 2005 14:45

Re: Stringgrid Zelle unterschiedlich färben
 
Zitat:

Zitat von Sharky
Hai (b)engelchen.
Ich glaube Du hast auch nicht richtig gelesen. Er möchte ja in einer Zelle mehr als eine Farbe.

Zitat:

Zitat von himitsu
schau mal unter CANVAS ... du kannst alle möglichen Zeichenoperationen da verwenden ;)

na verstanden hatte ich es schon richtig, denk ich mal ... wie gesagt, es mußten doch nur die Zeichenoperationen so angepasst werden, daß da mehrere Farbbereiche entstehen ^^

Avax2k 16. Mai 2006 19:42

Re: Stringgrid Zelle unterschiedlich färben
 
sorry, dass ich das thema herauskrame aber ich bekomme es einfach nicht hin die hier genannte Funktion auszuführen..

ich verwende den Code auf der ersten Seite bei dem man zwei farben einfügen kann und will mit einem knopfdruck eine Zelle färben aber das geht nicht weil er sagt dass TGridDrawState und Enumeration inkompatibel sind.. mein Aufruf ist wie folgt:

Delphi-Quellcode:
Stringgrid1drawcell(StringGrid1,1,1,Rect(0,0,0,0),gdSelected);
und das geht eben nicht wie rufe ich die Funktion denn nun auf ? :(

Hawkeye219 16. Mai 2006 20:32

Re: Stringgrid Zelle unterschiedlich färben
 
Hallo,

du mußt beim Aufruf im letzten Parameter eine Menge übergeben:

Delphi-Quellcode:
StringGrid1DrawCell (StringGrid1, 1, 1, Rect(0, 0, 0, 0), [gdSelected]);
Gruß Hawkeye

Avax2k 16. Mai 2006 20:39

Re: Stringgrid Zelle unterschiedlich färben
 
Vielen Dank..in der Delphi Hilfe war leider kein Beispiel dabei um es zu veranschaulichen man hat nur die States beschrieben die es gibt
:thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:38 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