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: Zellen-Farbe bei Click ändern (https://www.delphipraxis.net/85294-stringgrid-zellen-farbe-bei-click-aendern.html)

Helmi 28. Jan 2007 19:46


StringGrid: Zellen-Farbe bei Click ändern
 
Hallo,

wie kann ich auf einen Click auf eine Zelle deren Farbe ändern?

hab bei den Schweizern einen Code gefunden - nur markiert der die Zellen, die markiert sind, aber nicht die, die den focus hat.
(http://www.swissdelphicenter.ch/de/showcode.php?id=1258)

Ich möchte aber dass die focusierte Zelle eine Farbänderung erhält.

Weiss jemand wie das geht?

Lannes 28. Jan 2007 19:50

Re: StringGrid: Zellen-Farbe bei Click ändern
 
Hallo,

da gibt es auch noch gdFocused ...

Helmi 28. Jan 2007 19:53

Re: StringGrid: Zellen-Farbe bei Click ändern
 
gdfocused hatte ich auch schon probiert, bin aber auf keinen grünen zweig gekommen

Lannes 28. Jan 2007 19:54

Re: StringGrid: Zellen-Farbe bei Click ändern
 
Hallo,

wie hast Du es denn probiert?

Helmi 28. Jan 2007 20:01

Re: StringGrid: Zellen-Farbe bei Click ändern
 
so wie im Code der schweizern nur eben anstatt
Delphi-Quellcode:
If state = [gdselected] then
hab ich folgendes gemacht:
Delphi-Quellcode:
If state = [gdfocused] then

marabu 28. Jan 2007 20:08

Re: StringGrid: Zellen-Farbe bei Click ändern
 
Hallo,

der State-Parameter in OnDrawCell() ist ein Mengentyp - dreh das ganze mal um:

Delphi-Quellcode:
if gdFocused in State then ...
Grüße vom marabu

Lannes 28. Jan 2007 20:14

Re: StringGrid: Zellen-Farbe bei Click ändern
 
Hallo,

oder:
Delphi-Quellcode:
if (state = [gdFocused,gdSelected]) then
  //...
Je nach dem was Du genau machen willst.

Helmi 28. Jan 2007 20:18

Re: StringGrid: Zellen-Farbe bei Click ändern
 
Zitat:

Zitat von marabu
Hallo,

der State-Parameter in OnDrawCell() ist ein Mengentyp - dreh das ganze mal um:

Delphi-Quellcode:
if gdFocused in State then ...
Grüße vom marabu

danke - so funktioniert es - aber nur teilweise
das heisst, es ist nur in farbe, wenn die Zelle focusiert ist - aber sie soll dauerhaft in der farbe bleiben

mkinzler 28. Jan 2007 20:20

Re: StringGrid: Zellen-Farbe bei Click ändern
 
Dann mußt du dir für diesen Fall beim erstmaligen Zeichen merkem, da0 diese Spalte markiert ist.

Helmi 28. Jan 2007 20:33

Re: StringGrid: Zellen-Farbe bei Click ändern
 
und wie mach ich das am besten?

Hansa 28. Jan 2007 20:42

Re: StringGrid: Zellen-Farbe bei Click ändern
 
Ich würde jeder Zelle ein TObject mit den wichtigen Eigenschaften als Record verpassen und diese dann in OnDrawCell auswerten.

Lannes 28. Jan 2007 20:45

Re: StringGrid: Zellen-Farbe bei Click ändern
 
Hallo,

falls Du StringGrid.Objects noch nicht anderweitig verwendest,
wäre das folgende denkbar:
Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
const SelColor = ClRed;
begin
  with TStringGrid(Sender), Canvas do
    begin
    if Integer(Objects[aCol,ARow]) = 1 then
      Brush.Color := FocusedColor
      else
        Brush.Color := Color;
    FillRect(Rect);
    TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Cells[aCol, aRow]);
    end;
end;

procedure TForm1.StringGrid1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var ACol,ARow : Integer;
begin
  with TStringGrid(Sender), Canvas do
    begin
    MouseToCell(X,Y,ACol,ARow);
    Objects[ACol,ARow] := Pointer(Integer(Objects[ACol,ARow]) xor 1);
    end;
end;

Helmi 28. Jan 2007 21:00

Re: StringGrid: Zellen-Farbe bei Click ändern
 
Hallo
und vielen Dank!

hab deinen Code etwas angepasst und so funktionierts bestens:
Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
const
  SelColor = ClRed;

begin
  with TStringGrid(Sender), Canvas do
    begin
      If gdFixed in state then
        exit;

      If Integer(Objects[aCol,ARow]) = 1 then
        Brush.Color := SelColor
      else
        Brush.Color := Color;

      FillRect(Rect);
    end;
end;

Hansa 28. Jan 2007 21:00

Re: StringGrid: Zellen-Farbe bei Click ändern
 
Zitat:

Zitat von Lannes
..falls Du StringGrid.Objects noch nicht anderweitig verwendest,
wäre das folgende denkbar...

Inwiefern "anderweitig" ? :shock: Er bräuchte doch nur den eventuell vorhandenen TObject Record um ein Feld, z.B. Farbe zu erweitern und diesen Wert im OnClick dann im Stringgrid.TObject [ACol,ARow] zu setzen. Und fertig. :zwinker:

Helmi 28. Jan 2007 21:11

Re: StringGrid: Zellen-Farbe bei Click ändern
 
Zitat:

Zitat von Hansa
Inwiefern "anderweitig" ? :shock: Er bräuchte doch nur den eventuell vorhandenen TObject Record um ein Feld, z.B. Farbe zu erweitern und diesen Wert im OnClick dann im Stringgrid.TObject [ACol,ARow] zu setzen. Und fertig. :zwinker:

Wie meinst du das Hansa?

ich muss gestehen - ich hab bisher nichts mit Objects zu tun gehabt

mkinzler 28. Jan 2007 21:18

Re: StringGrid: Zellen-Farbe bei Click ändern
 
Man kann zu jeder Zelle eine Klasseninstanz abspeichern. Diese kann man mit .Objects adressieren

Lannes 28. Jan 2007 21:52

Re: StringGrid: Zellen-Farbe bei Click ändern
 
hallo,
Zitat:

Zitat von Hansa
Zitat:

Zitat von Lannes
..falls Du StringGrid.Objects noch nicht anderweitig verwendest,
wäre das folgende denkbar...

Inwiefern "anderweitig" ? :shock:

könnte sein das er z.B. schon einen Record eingehängt hat.
Zitat:

Zitat von Hansa
Er bräuchte doch nur den eventuell vorhandenen TObject Record um ein Feld, z.B. Farbe zu erweitern und diesen Wert im OnClick dann im Stringgrid.TObject [ACol,ARow] zu setzen. Und fertig. :zwinker:

genau :mrgreen:

Hansa 28. Jan 2007 22:47

Re: StringGrid: Zellen-Farbe bei Click ändern
 
Das hier hat sich überschnitten mit meinem Posting :

Zitat:

Zitat von Helmi
hab deinen Code etwas angepasst und so funktionierts bestens:

Nur, wie hängt das hiermit zusammen :

Zitat:

Zitat von Helmi
ich muss gestehen - ich hab bisher nichts mit Objects zu tun gehabt

Dürfte dann wohl nur kurz gehen. :mrgreen:

Würde das ganze so aufbauen :

Delphi-Quellcode:
procedure Tfrm.AddAusgObject(ACol, ARow : integer); // protected
var              
  AusgObject : TAusgObject;
begin
  AusgObject := TAusgObject.Create;
...
  AusgObject.Color := clWhite;  // Standardwert
...
  sgNr.Objects[ACol, ARow] := AusgObject;
  ObjektZaehler := ObjektZaehler + 1; // Abgleich Anzahl createter TObjects
end;
Das ist je nach Anwendung lediglich die Spitze des Eisbergs. :cat:

Edit :

Delphi-Quellcode:
  TAusgObject = class(TObject)
    D  : boolean; // später Auswertung, ob Anzeige als real erfolgt
                    // und ein Hinweis in der Zelle erscheint
    Color     : TColor;
    P : PTyp;
    constructor Create;
    destructor Destroy;
  end;
So ungefähr sieht der Typ (abgekürzt) aus. Automatisch geht da nicht viel. Es ist Programmierung gefragt. :duck:

Helmi 29. Jan 2007 04:15

Re: StringGrid: Zellen-Farbe bei Click ändern
 
Hallo Hansa,

ich versteh was du machen willst damit, aber findest du nicht, dass das etwas overload ist, um nur eine Farbe zu ändern?
Ich mein, ich stell mit dem StringGrid nichts anderes an, als dass ich auf leere Zellen klicke und diese farbig markiere.
Kein Text, kein sonstiges

Lannes 29. Jan 2007 08:02

Re: StringGrid: Zellen-Farbe bei Click ändern
 
Hallo,

TColor ist ein Integer.
Also kann man direkt mit
Delphi-Quellcode:
Objects[ACol,ARow] := Pointer(clRed);
eine Farbe in Objects speichern und mit
Delphi-Quellcode:
Color := Integer(Objects[ACol,ARow]);
wieder auslesen.

Alle Objects des StringGrids werden mit Pointer(0) bei der Erzeugung initialisiert.
Vorteilhaft ist es beim Start der Anwendung in FormCreate allen Objects Pointer(StringGrid.Color) zuweisen.

Hansa 29. Jan 2007 08:25

Re: StringGrid: Zellen-Farbe bei Click ändern
 
Zitat:

Zitat von Helmi
...ich stell mit dem StringGrid nichts anderes an, als dass ich auf leere Zellen klicke und diese farbig markiere.
Kein Text, kein sonstiges

Du brauchst also nur eine einzige Eigenschaft pro Zelle und das ist die Farbe ? Na dann schreibe die doch gleich in die Zelle und werte sie aus. Also : Zelle besteht z.B. aus dem Text 'clRed'. Anhand dieses Strings wird im OnDrawCell die Zelle neu mit dieser Farbe gezeichnet. Ist das gezeichnete Rect so groß wie die Zelle, dann ist von dem String 'clRed' nichts mehr zu sehen und fertig ist. Viele Wege führen nach Rom. :mrgreen:

marabu 29. Jan 2007 09:39

Re: StringGrid: Zellen-Farbe bei Click ändern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

kein Zweifel - alle beschriebenen Wege führen in die italienische Hauptstadt, aber wenn man weiß wie ein StringGrid intern arbeitet, dann möchte man keine Farbnamen in den Zellen speichern. Aus dem gleichen Grund würde ich wohl auch die Objects[] nicht für eine Farbkodierung verwenden wollen. Man quält den Speicherverwalter, wenn man eine sparse matrix wie ein fest dimensioniertes Array benutzt. Wenn es nur um interaktive Farbkodierung geht, würde ich in Abhängigkeit von der Zustandsanzahl einen linearen BitVector oder ein korrelierendes zweidimensionales Array of Byte einsetzen. Ich habe mal für den letzteren Fall eine Demo angehängt. Idealerweise nimmt man ein statisches Array, aber ich habe im Beispielcode ein dynamisches Array implementiert. Die Umstellung sollte leicht fallen, da die Initialisierung dann einfach per ZeroMemory() erfolgen kann.

Grüße vom marabu

Hansa 29. Jan 2007 10:24

Re: StringGrid: Zellen-Farbe bei Click ändern
 
Marabu, das wäre der dritte Weg. Aber das ist nicht der goldene Mittelweg. Unabhängig vom Grid noch ein Array mitschleppen. Es geht aber noch mehr. Wie wäre es mit INI usw. ? 8) Beim Array ist schlecht, dass es ohne weiteres so nicht geht, sofern das Grid nicht starr ist. Schachbrett könnte man so behandeln, aber wehe RowCount etc. ändert sich. Es wäre schwierig das Grid und das Array synchron zu halten. Diese Hürde fällt bei den Objects einfach weg.

Sollte das Grid nur Farben behandeln können und ist es auch noch starr, dann würde ich aber wirklich die Farben im Klartext in die Zellen schreiben. Zu sehen ist davon nämlich absolut nichts.

Helmi 29. Jan 2007 15:31

Re: StringGrid: Zellen-Farbe bei Click ändern
 
Hallo Jungs,

danke für eure Vorschläge.

ich bin aber jetzt auf der Schiene mit den Objects geblieben und hab es etwas ausgebaut - nachdem ich dahinter gekommen bin, wie es funktioniert.

Anbei ein Test-Projekt. Wie gesagt - es ist ein Test-Projekt - deswegen die Standard-Bezeichnungen der Komponenten und ohne Kommentare. (Ich mach gerne Testprojekte um dann die Erkenntnisse daraus ins eigentliche Projekt zu übernehmen)

Damit schlag ich 2 Fliegen mit einer Klappe.
1. das Ändern mit der Farbe (die Frage dieses Threads)
2. die Frage auf das Feststellen einer Zellenfarbe (von diesem Thread)


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