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 Stringrid: Nach dem Scrollen sind Zellen nicht gefärbt (https://www.delphipraxis.net/137996-stringrid-nach-dem-scrollen-sind-zellen-nicht-gefaerbt.html)

BetaBot 1. Aug 2009 20:49


Stringrid: Nach dem Scrollen sind Zellen nicht gefärbt
 
Guten Abend Delphi - Gemeinde,

nach langem Suchen konnte ich keine Lösung für mein Problem finden, das wie folgt aussieht:

Ich habe ein Stringgrid. DefaultDrawing auf True und trotzdem färbe ich die ersten drei Zeilen (a 4 Spalten) im OnDrawCell - Ereignis blau ein.
Wenn ich nun die ersten drei Zeilen vertikal aus dem Form scrolle und sie zurückhole, ist die zweite Zeile nicht mehr blau. Erst mit einem Klick auf das Feld ist alles wieder wie gewollt. Mit DefaultDrawing auf True sieht das Problem nahezu identisch aus.
Hat irgendjemand eine Lösung für dieses Problem? Das Stringgrid funktioniert soweit, sieht aber alles andere als gut aus mit diesem Problem.

Ich hoffe, ihr könnt helfen.

Danke soweit,

BetaBot.

Keldorn 2. Aug 2009 07:34

Re: Stringrid: Nach dem Scrollen sind Zellen nicht gefärbt
 
Hallo

wie genau sieht deine ondrawcell-routine aus?

Gruß Frank

BetaBot 2. Aug 2009 08:51

Re: Stringrid: Nach dem Scrollen sind Zellen nicht gefärbt
 
Guten Morgen Frank,

hier ein Ausschnitt aus dem Code des OnDrawCell - Ereignisses, indem meiner Meinung nach der Fehler liegen muss - Begründung folgt...

Delphi-Quellcode:
    (* Die zellenübergreifenden Beschriftungen *)

    Canvas.Brush.Color := mylblue;
    Canvas.Pen.Color := mylblue;
    Canvas.Font.Style := [fsbold];
    Canvas.Font.Color := clwhite;
    If (arow = 0) or (arow = 9) then
    begin
      Myrect := Classes.Rect(0,ARow*(DefaultRowHeight+GridLineWidth),4*defaultColWidth+4*GridlineWidth,(ARow+1)*(DefaultRowHeight+GridLineWidth));
      Canvas.Rectangle(MyRect.Left,MyRect.Top,MyRect.Right-1,MyRect.Bottom+1);
      DrawText(Canvas.Handle,PChar(Cells[0,ARow]),-1,
               Myrect,
               DT_SingleLine or DT_Center or DT_VCENTER);

    end else

    If (arow = 1) or (ARow = 10) then
    begin

      Case acol of
        0,1 :
        begin
          Myrect := Classes.Rect(0,ARow*(DefaultRowHeight+GridLineWidth),2*defaultColWidth,(ARow+1)*(DefaultRowHeight+GridLineWidth));
          Canvas.Rectangle(MyRect.Left,MyRect.Top,MyRect.Right+1,MyRect.Bottom+1);
          DrawText(Canvas.Handle,PChar(Cells[0,Arow]),-1,
                   Myrect,
                   DT_SingleLine or DT_Center or DT_VCENTER);
        end;
        2,3 :
        begin
          Myrect := Classes.Rect(2*defaultColWidth+2*GridlineWidth,ARow*(DefaultRowHeight+GridLineWidth),4*defaultColWidth+4*GridlineWidth,(ARow+1)* DefaultRowHeight+GridLineWidth));
          Canvas.Rectangle(MyRect.Left,MyRect.Top,MyRect.Right-1,MyRect.Bottom);
          DrawText(Canvas.Handle,PChar(Cells[2,ARow]),-1,
                   Myrect,
                   DT_SingleLine or DT_Center or DT_VCENTER);
        end;
      End;
    end;
Begründung: Er zeichnet wie gesagt alles korrekt, aber sobald gescrollt wird und nur die erste Zeile aus dem Bild verschwindet und ich dann mit dem "Focus - Rechteck" über das Grid wandere (Maus oder Tastatur) zerlegt es meine Farbtruktur völlig, hier werden Zellen weiß, dann wieder blau bei Click usw.

Meine Lösung: Ich habe jetzt die farbigen Zellen für die Selektion in OnSelectCell gesperrt und zeichne die Zellen einzeln. Zellenübergreifende Begriffe stelle ich mit Textout dar und so funktioniert es bisher.

Wenn du trotzdem eine Idee hast, was es sein könnte, bin ich dankbar, zumal ich die Funktionsweise eines Stringgrids gern besser verstehen würde, z.B. was wird beim Scrollen ausgelöst?

MfG, Silvio

Keldorn 2. Aug 2009 09:05

Re: Stringrid: Nach dem Scrollen sind Zellen nicht gefärbt
 
ersmtal kurz ;-):
- du kannst mit drawfocusrect das Fokusrechteck selbst über deine verbundenen Zellen zeichnen
- evtl. bei stringgrid ontopleftchange jedes mal dass Grid komplett neuzeichnen.

BetaBot 2. Aug 2009 09:33

Re: Stringrid: Nach dem Scrollen sind Zellen nicht gefärbt
 
Hallo nochmal,

vielen Dank für den Hinweis mit DrawFocusRect - werde ich später probieren, weil plötzlich funktioniert es auch nicht mehr korrekt wie oben beschrieben. Es geht 40 mal gut und plötzlich verschwinden wieder Wörter. Im Moment bin ich nur ohne Ende frustiert und lass die ganze Sch.. erstmal liegen.

Bei OnTopLeftChange habe ich schon Repaint und Refresh ausgelöst - kein Erfolg.

Aber noch eine Frage zum Abschluss: Warum wird in Tutorials immer wieder darauf hingewiesen, dass die Eigenschaft DefaultDraw false sein soll, wenn man selbst zeichnet?
Ich habe sie auf true (mit DefaultDraw := false habe ich übrigens das gleiche Problem) und zeichne selbst, was ich ändern möchte und ansonsten nehme ich gern die Gitterlinien in Anspruch. Aber der Hinweis wird sicher seinen Grund haben. Nur welchen?


bis später...

BoolString 2. Aug 2009 11:29

Re: Stringrid: Nach dem Scrollen sind Zellen nicht gefärbt
 
Irgendwie fehlt mir da was.
Das Ganze im OnDrawCell... gut. Aber nur ein Teil davon, oder? was passiert da sonst noch? Wo ist dein With Konstrukt mit dem du den Canvas vom StringGrid nutzt? Wo machst du die konkrete Farbeumschaltung? Hast du schon mal probiert das Rect direkt zu verwenden (stringgrid.Canvas.FillRect (Rect);) ?

Oder entgeht mir da was?

Jan

Hobby-Programmierer 3. Aug 2009 00:15

Re: Stringrid: Nach dem Scrollen sind Zellen nicht gefärbt
 
Hab gerade gesehen das du in der falschen Sparte gepostest hast.
zum Thema:
Warum greifst du net auf das Rect von OnDrawCell zurück?
Zeig mal die gesamte Procedure bzw, stell doch einfach das Project hier rein - dann findet sicher jemand den Fehler und muss net immer nachfragen!

DP-Maintenance 6. Aug 2009 08:39

DP-Maintenance
 
Dieses Thema wurde von "TBx" von "Neuen Beitrag zur Code-Library hinzufügen" nach "VCL / WinForms / Controls" verschoben.
Ist bein Vorschlag für die CL

Blup 7. Aug 2009 08:39

Re: Stringrid: Nach dem Scrollen sind Zellen nicht gefärbt
 
Zitat:

Zitat von BetaBot
Ich habe sie auf true (mit DefaultDraw := false habe ich übrigens das gleiche Problem) und zeichne selbst, was ich ändern möchte und ansonsten nehme ich gern die Gitterlinien in Anspruch. Aber der Hinweis wird sicher seinen Grund haben. Nur welchen?

Der Grund ist eventuelles Flackern, wenn die Zelle z.B. erst Weis und dann von dir Gelb gezeichnet wird.
Wenn man mehrere Zellen verbunden als eine zeichnet, möchte man eventuell auch das Fokusrechteck anpassen.

Der Fehler liegt hier darin, daß bei der Berechnung des Zellenbereichs der Verbundzelle das Skrollen und feste Spalten nicht berücksichtigt werden (LeftCol, TopRow). Durch Scrollen kann auch nur eine Zelle der Verbundzelle tatsächlich sichtbar sein, der andere Teil z.B. durch fixe Spalten oder Zeilen verdeckt. Darum sollte man im OnDrawCell wirklich nur in den Bereich zeichnen, der übergeben wird, auch wenn man den erweiterten Bereich ermitteln muss, um z.B. Text richtig auszurichten.


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