Autor Beitrag
Adrian
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 314



BeitragVerfasst: Do 31.01.08 17:46 
Servus!

Mich beschäftigt seite einiger Zeit ein – für mich unerfindliches – Problem im Zusammenhang mit StringGrids. Im unstenstehenden Beispielcode sieht man, daß ich die JEDI-Version verwende (wengen der Möglichkeit, den Inhalt als csv-Datei zu speichern und zu lesen), aber auch bei der originalen Version tritt es genauso auf.
Bei meinem Beispiel ist nur die erste Zeile fix, alle (4) Spalten sind variabel. Nach dem Einlesen sehe ich auf leicht grün gefärbten Feldern einen schwarzen Text – so soll das auch sein. Die erste freie Zelle ist durch eine Umrandung markiert. Über „Button1Click“ möchte ich nun eine auswählbare Zeile bläulich hinterlegen, später soll das automatisch gehen und den momentan anstehenden Ablaufschritt markieren. Und nun kommt das Sonderbare: Sobald ich über den SpinEdit die Zeilennummer auswähle (oder sonst eine Schaltfläche betätige) wird der Text in der o.a. Zelle weiß gefärbt. Wähle ich per Mausklick eine andere Zelle aus, dann wird der Inhalt der neuen Zelle weiß.
Warum ist das so?
Was kann ich tun, damit das nicht mehr vorkommt?
Die Options beim StringGrid stehen auf
[goFixedVertLine,goFixedHorzLine,goVertLine,goHorzLine]
und – falls das wichtig ist -
ParentFont, ParentColor := False

Nun noch der Beispielcode:

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:
23:
24:
procedure TForm1.JvAblaufGridDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  with JvAblaufGrid do
  begin
    if ARow>0 then
    begin
      if ARow=Reihe then
        Canvas.Brush.Color := clAqua
      else
        Canvas.Brush.Color := clMoneyGreen;
      Canvas.FillRect(Rect);
      Canvas.TextOut(Rect.Left+2,Rect.Top+2,Cells[ACol,ARow]);
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Reihe := SpinEdit1.Value;
  JvAblaufGrid.InvalidateRow(Reihe);
  Delay(500);//Verzögerung 500ms
  JvAblaufGrid.InvalidateRow(Reihe);
end;


Und falls keine Verbesserung möglich wäre – was ich allerdings nicht glaube – womit könnte man so eine Schrittanzeige noch realisieren? In meinen Komponenten habe ich bislang nichts besseres gefunden.

Gruß,

Adrian
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Fr 01.02.08 12:02 
Hallo,

mit Deinem Titel liegst Du richtig:wink:

Durch Aktivierung einer anderen Komponente verliert das Grid den Focus.
Dadurch ändert sich der Status der aktiven Zelle von gdFocused(Zellumrandung) auf gdSelected(Vollmarkierung).
Mit dem Status gdSelected wird auch die Schriftfarbe geändert auf weiß, damit man bei der dunkelen Zelleinfärbung(die Du anders einfärbst) den Text noch lesen kann.

Du musst also in OnDrawCell darauf reagieren und die Schriftfarbe entsprechend setzen.

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )