AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Stringrid: Nach dem Scrollen sind Zellen nicht gefärbt
Thema durchsuchen
Ansicht
Themen-Optionen

Stringrid: Nach dem Scrollen sind Zellen nicht gefärbt

Ein Thema von BetaBot · begonnen am 1. Aug 2009 · letzter Beitrag vom 7. Aug 2009
Antwort Antwort
BetaBot

Registriert seit: 6. Mai 2007
35 Beiträge
 
Turbo Delphi für Win32
 
#1

Stringrid: Nach dem Scrollen sind Zellen nicht gefärbt

  Alt 1. Aug 2009, 20:49
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.
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

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

  Alt 2. Aug 2009, 07:34
Hallo

wie genau sieht deine ondrawcell-routine aus?

Gruß Frank

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
BetaBot

Registriert seit: 6. Mai 2007
35 Beiträge
 
Turbo Delphi für Win32
 
#3

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

  Alt 2. Aug 2009, 08:51
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
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

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

  Alt 2. Aug 2009, 09:05
ersmtal kurz :
- du kannst mit drawfocusrect das Fokusrechteck selbst über deine verbundenen Zellen zeichnen
- evtl. bei stringgrid ontopleftchange jedes mal dass Grid komplett neuzeichnen.

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
BetaBot

Registriert seit: 6. Mai 2007
35 Beiträge
 
Turbo Delphi für Win32
 
#5

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

  Alt 2. Aug 2009, 09:33
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...
  Mit Zitat antworten Zitat
BoolString

Registriert seit: 2. Feb 2009
Ort: Varel
70 Beiträge
 
RAD-Studio 2009 Pro
 
#6

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

  Alt 2. Aug 2009, 11:29
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
  Mit Zitat antworten Zitat
Hobby-Programmierer

Registriert seit: 19. Jan 2006
Ort: München
392 Beiträge
 
Delphi XE Starter
 
#7

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

  Alt 3. Aug 2009, 00:15
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!
Mario
'Lesen Sie schnell, denn nichts ist beständiger als der Wandel im Internet!'
  Mit Zitat antworten Zitat
6. Aug 2009, 08:39
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

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#9

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

  Alt 7. Aug 2009, 08:39
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:58 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