Autor Beitrag
MrMister
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 107

Win XP, Ubuntu 8.04
Delphi 7 Prof., Delphi 2005 Pers.
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Fr 01.06.07 15:45 
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:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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:


ausblenden 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;




ausblenden 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;


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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*