Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Markierung beim Erstellen eines StringGrids verhindern


MrMister - Fr 01.06.07 14:55
Titel: Markierung beim Erstellen eines StringGrids verhindern
Hallo liebe Forengemeinde,

ich habe noch ein kleines Problem mit einem StringGrid... Bei einem bestimmten Ereignis möchte ich, dass sich das Grid durchgängig in einer bestimmten Farbe färbt (ist ja soweit kein Problem -> StringGrid.Color), allerdings stört dabei, dass die aktuell markierte Zelle noch eine andere Farbe hat (eben weil sie markiert ist). Hier im Forum gab es schon mehrere Ansätze, wie man das lösen kann, die laufen aber meist darauf hinaus, im OnDrawCell-Ereignis das besagte Feld mit der gewünschten Farbe zu füllen - Das funktioniert für mich aber nicht, weil ich in meinem StringGrid ja schon Einträge habe, die dann nicht mehr sichtbar wären. Ich habe auch schon versucht, das ganze einfach mit einem Image zu überzeichnen, aber das geht nur, wenn ich das Bild in das StringGrid einbinde (gleiches Problem wie oben), wenn ich das StringGrid größer mache und versuche, die betroffene Zeile einfach mit dem Image zu verstecken, dann bleiben die Borders des StringGrid erhalten. Mit active und SetFocus auf ein anderes Element hats auch nicht funktioniert, das Auswahlrechteck bleibt in der Zelle, Editormode verhindert zwar, dass man danach noch andere Felder markieren kann, das am Anfang markierte Feld bleibt allerdings farbig. Praktisch wäre sowas wie StringGrid.SelectCell:=false; oder sowas, aber ich schätze mal nicht, dass es sowas geben wird.
Hat vll jemand einen Vorschlag, wie ich das irgendwie umgehen kann?

Viele liebe Grüße,
MrMister


Shorty - Fr 01.06.07 15:37

Moin!

Das StringGrid hat eine Option, mit der man das selektieren verhindern kann, die Eigenschaft ist bei dem StringGrid unter Options und dann goEditing, das musst du auf false stellen.
Dann lässt sich keine Zelle mehr markieren, aber man kann sie halt auch nicht mehr bearbeiten, weiss jetzt nicht, ob du das brauchst.

Mfg Shorty


MrMister - Fr 01.06.07 15:44

Das hatte ich leider auch schon versucht, aber auch da markiert er mir die Zelle [0,0] farbig, auch wenn ich danach keine andere Zelle mehr markieren kann :(


Marc. - Fr 01.06.07 15:45
Titel: Re: Markierung beim Erstellen eines StringGrids verhindern
user profile iconMrMister hat folgendes geschrieben:
Das funktioniert für mich aber nicht, weil ich in meinem StringGrid ja schon Einträge habe, die dann nicht mehr sichtbar wären.

Und wo liegt das Problem? Dann zeichnest du das Geschriebene einfach wieder drüber:

Bsp:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.StringGrid1.OnDrawCell(Sender: TObject;
                             ACol, ARow: Integer;
                             Rect: TRect;
                             State: TGridDrawState);
begin
  if (ACol > 0and (ARow > 0then        // Stringgrid komplett einfärben
      Grid.Canvas.Brush.Color := clgreen;

  if (ARow > 0and (ACol > 0then        // Text drüberzeichnen
    Grid.Canvas.TextRect(rect,
                         rect.Left + 40,   // ausrichten
                         rect.Top + 5,
                         Grid.Cells[ACol, ARow]);
end;


Canvas.TextRect sollte dir also weiterhelfen. ;)

€: Das Editieren kannst du dann aber auch wieder zulassen! (goEditing)


MrMister - Fr 01.06.07 16:48

Mhh, schonmal ein Fortschritt - Er färbt jetzt das komplette StringGrid, ohne dass ich einen Selektionsrahmen irgendwo habe, aber die Werte übermalt er mir trotzdem, bis die Farbe wieder auf dem Ursprungswert ist.
Hier mal die betreffenden Prozeduren:



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TFormSudoku.StringGrid1DrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
begin

[...]

IF faerben=true THEN
begin


  if (ACol >= 0and (ARow >= 0then        // Stringgrid komplett einfärben
      StringGrid1.Canvas.Brush.Color := farbe;

  if (ARow >= 0and (ACol >= 0then        // Text drüberzeichnen
    StringGrid1.Canvas.TextRect(rect,
                         rect.Left + 40,   // ausrichten
                         rect.Top + 5,
                         StringGrid1.Cells[ACol, ARow]);
end;


end;





Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
[...]



IF invalid=true THEN
  begin
    farbe:=clMaroon;
    faerben:=true;
    StringGrid1.Repaint;
    LabelInvalidTrue.Visible:=True;
    TimerCheck.Enabled:=True;
  end
  ELSE begin
    farbe:=clGreen;
    faerben:=true;
    StringGrid1.Repaint;
    LabelInvalidFalse.Visible:=True;
    TimerCheck.Enabled:=True;
  end;



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TFormSudoku.TimerCheckTimer(Sender: TObject);
begin
faerben:=false;
StringGrid1.Repaint;
TimerCheck.Enabled:=False;
end;


faerben ist ein bool-wert, farbe ist vom Typ word. Irgendwie bin ich grade ratlos. :(


Sinspin - Fr 01.06.07 20:13

hallo, farbe muss vom typ integer oder TColor sein.

wie man dem bild entnehmen kann funktioniert das beliebige einfärben eigentlich problemlos, wobei hier das pinke feld markiert ist.


MrMister - Fr 01.06.07 20:26

Ok, ich werd mir das morgen nochmal zu Gemüte führen, mit den word-Variablen hats aber eigentlich auch einwandfrei funktioniert *wunder*