Autor |
Beitrag |
MrMister
Hält's aus hier
Beiträge: 12
|
Verfasst: Fr 01.06.07 14:55
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
      
Beiträge: 107
Win XP, Ubuntu 8.04
Delphi 7 Prof., Delphi 2005 Pers.
|
Verfasst: 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 
Hält's aus hier
Beiträge: 12
|
Verfasst: 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.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Fr 01.06.07 15:45
MrMister 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 > 0) and (ARow > 0) then Grid.Canvas.Brush.Color := clgreen;
if (ARow > 0) and (ACol > 0) then Grid.Canvas.TextRect(rect, rect.Left + 40, 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 
Hält's aus hier
Beiträge: 12
|
Verfasst: 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 >= 0) and (ARow >= 0) then StringGrid1.Canvas.Brush.Color := farbe;
if (ARow >= 0) and (ACol >= 0) then StringGrid1.Canvas.TextRect(rect, rect.Left + 40, 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
      
Beiträge: 1335
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: 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.
Einloggen, um Attachments anzusehen!
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
MrMister 
Hält's aus hier
Beiträge: 12
|
Verfasst: 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*
|
|
|