Eye-Candy-Grid Zellen einfärben

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Ronny58
Beiträge: 82
Registriert: So 27. Apr 2014, 20:35

Eye-Candy-Grid Zellen einfärben

Beitrag von Ronny58 »

Hallo Zusammen,

in einer Applikation setze ich das TECGrid von Eye-Candy ein.
In einem TList-Record habe ich, unter anderem ein Array mit 3 Spalten (Name, Typ, Beschreibung).
Dieses Array wird je nach ausgewähltem Record in dem TECGrid angezeigt.

In meinem TList gibt es nun eine Suchfunktion, die in dem Record (auch in dem Array) nach Begriffen sucht (Volltextsuche). Jedes Vorkommen des Begriffs soll in der Anzeige im Dialog farblich hervorgehoben werden. Das gelingt mir im gesamt Form, nur beim TECGrid nicht.

Ich dachte, dazu wäre das Ereignis OnDrwaDataCell gedacht. Ich habe dort folgende Funktion zum einfärben eingebaut:

Code: Alles auswählen

procedure TfSyntax.ecgParameterDrawDataCell(Sender: TObject; ACanvas: TCanvas;
  ACol, ARow: Integer; var AHandled: Boolean);
begin
  ACanvas.Brush.Color:=clNone;
  if length(arrCMD) > 0 then
  begin
    if (ACol = 1) and
       (ARow = arrCMD[IndexAktCMD,ipArrParaCol1]) and
       (arrCMD[IndexAktCMD,ipArrParaCol1] <> 0) then
       ACanvas.Brush.Color:= cHighLight;
    if (ACol = 2) and
       (ARow = arrCMD[IndexAktCMD,ipArrParaCol2]-1) and
       (arrCMD[IndexAktCMD,ipArrParaCol2] <> 0) then
       ACanvas.Brush.Color:= cHighLight;
    if (ACol = 3) and
       (ARow = arrCMD[IndexAktCMD,ipArrParaCol3]-1) and
       (arrCMD[IndexAktCMD,ipArrParaCol3] <> 0) then
       ACanvas.Brush.Color:= cHighLight;
  end;
end;
Kurz das arrCMD erklärt:
in dem dynamischen Array arrCMD ist hinterlegt welche Zelle eingefärbt werden soll. Klappt toll.
IndexAktCMD = aktueller in einer Listbox ausgewählter Record
ipArrParaCol1 = Spalte des Vorkommens des Begriffs
arrCMD[IndexAktCMD,ipArrParaCol1] = enthält die Zeile des Vorkommens im Array des Records

Die Logik funktioniert. Das Programm geht in die Funktion rein und setzt auch ACanvas.Brush.Color richtig.
Im TECGrid wird die Farbe aber nicht angezeigt. Trotz TECGrid.Repaint am Abschluss als auch TECGrid.Refrehs.
Jetzt hab ich schon gedacht, der Style der Komponenten müsste auf OwnerDraw gesetzt werden wie beim Listbox z.B. Aber diesen Style kennt die Komponenten nicht.

Ich denke ich stehe dicht vor der Lösung, bekomme aber die letzte Kurve nicht. Der Quell-Code der Komponente hilft mir auch nicht. Davor enden mein Kompetenzen.

Hat jemand einen Tip, wie ich DrawDataCell zum Erfolg führe?

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 819
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Eye-Candy-Grid Zellen einfärben

Beitrag von fliegermichl »

Kann es sein, dass der var Parameter aHandled auf true gesetzt werden muss? Ich kenne dieses TECGrid nicht. Notfalls halt die Paint Routine des Grids debuggen.

Ronny58
Beiträge: 82
Registriert: So 27. Apr 2014, 20:35

Re: Eye-Candy-Grid Zellen einfärben

Beitrag von Ronny58 »

Gerade getestet.

AHandled = True - Das Grid zeigt das Array nicht an (keine Datenausgabe).
AHandled = False - Das Grid zeigt das Array an, ignoriert aber weiterhin die Markierung.

Ronny58
Beiträge: 82
Registriert: So 27. Apr 2014, 20:35

Re: Eye-Candy-Grid Zellen einfärben

Beitrag von Ronny58 »

Breakpoint auf erste Zeile in TCustomECGrid.Paint;
Da kommt er nie rein.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 819
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Eye-Candy-Grid Zellen einfärben

Beitrag von fliegermichl »

Ronny58 hat geschrieben:
Fr 8. Mai 2020, 08:25
Breakpoint auf erste Zeile in TCustomECGrid.Paint;
Da kommt er nie rein.
Breakpoint in TfSyntax.ecgParameterDrawDataCell und dann mit F7 weitermachen. Falls das auch nicht geht, ist das Package ohne Debuggerinfos compiliert worden. Dann eben nochmal neu mit DebuggerInfos übersetzen lassen.

Ronny58
Beiträge: 82
Registriert: So 27. Apr 2014, 20:35

Re: Eye-Candy-Grid Zellen einfärben

Beitrag von Ronny58 »

Das mit Debug-Info hat tatsächlich gefehlt.

Habe jetzt folgendes entdeckt:

Code: Alles auswählen

    TPaintFlag = (pfEnabled, pfEditorMode, pfHasColEvent, pfHilighted, pfHilightRow,  pfImages,
                  pfRightToLeft, pfSelectedCell, pfSelectedCol, pfTopRow, pfBottomRow,
                  pfMultiSelect, pfNonHorScroll);
pfSelectedCell duftet nach der gewünschten Eigenschaft. Finde immo aber nur die Auswertung des Flags, nicht an welcher Stelle es gesetzt wird.

Die "Options" im Grid als auch in der Column beginnen alle mit "eco…" die finde ich auch.

Für Column:

Code: Alles auswählen

  TCOption = (ecoCellToHint,         { content of data cells is shown as a Hint }
              ecoEnlargePixels,      { False = [%], True = [px] }
              ecoReadOnly,           { column is ReadOnly (never shows editor) }
              ecoSizing,             { column can be resized }
              ecoSorting,            { column header has up/down arrow and pushed look when clicked }
              ecoVisible);           { column is Visible }
und fürs Grid:

Code: Alles auswählen

  TGOption = (egoAlwaysShowEditor,   { Editor is shown always }
              egoColMoving,          { columns can be moved }
              egoColSizing,          { columns can be resized }
              egoDottedGrid,         { grid line is dotted }
              egoEnlargeAlways,      { column is enlarged even if editor is not opened }
              egoHeaderPushedLook,   { header has pushed look when clicked }
              egoHilightCol,         { whole column is highlighted }
              egoHilightRow,         { whole row is hilighted }
              egoHorizontalLines,    { show horizontal lines of grid }
              egoReadOnly,           { grid is ReadOnly }
              egoScrollKeepVisible,  { selection remains visible while scrolling (scrollbars/mouse wheel) }
              egoSortArrow,          { sorting arrow in title is visible }
              egoTabs,               { tab goes through cell instead of controls }
              egoThumbTracking,      { scrollbars scrolls grid immediately }
              egoUseOrder,           { OrderedCols defined; excfOrder for Load/SaveColumnsToXML avail. }
              egoVerticalLines,      { show vertical lines of grid }
              egoWheelScrollsGrid);  { mouse wheel scrolls the grid, selection stays (i.e. it scrolls away) }
An welcher Stelle TPaintFlag gesetzt wird ist mir verschlossen.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 819
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Eye-Candy-Grid Zellen einfärben

Beitrag von fliegermichl »

Evtl. fehlt dieses Feature einfach. Du kannst aber eine eigene Klasse davon ableiten und die gewünschte Funktionalität selber machen. Dann bleibst du weitgehend save falls es mal neuere Versionen des Package geben sollte.

wp_xyz
Beiträge: 3581
Registriert: Fr 8. Apr 2011, 09:01

Re: Eye-Candy-Grid Zellen einfärben

Beitrag von wp_xyz »

Ist es wirklich nötig, das EyeCandy-Grid zu verwenden? Die Lazarus-Grids sind viel leistungsfähiger als die Delphi-Grids, und der Grund, warum manche Third-Party-Grids entstanden sind, ist für Lazarus hinfällig; stattdessen begibt man sich in die Abhängigkeit einer Fremdkomponente, die vielleicht überhaupt nicht mehr gepflegt wird (ich weiß, dass das für die EC-Controls nicht zutrifft).

Wenn es nur darum geht, einzelne Zellen entschiedlich einzufärben, reicht das Standard StringGrid/DrawGrid aus. Es gibt ein Event OnPrepareCanvas, das aufgerufen wird, nachdem alle Canvas-Eigenschaften schon gesetzt sind, aber die Zelle noch nicht gezeichnet ist. Das ist der ideale Punkt, noch schnell vor der Ausgabe Änderungen z.b. an Canvas.Brush.Color vorzunehmen. Im Unterschied zum OnDrawCell-Event, muss man sich hier nicht um die Ausgabe der Zell-Texte kümmern.
Zuletzt geändert von wp_xyz am Fr 8. Mai 2020, 13:29, insgesamt 1-mal geändert.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 819
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Eye-Candy-Grid Zellen einfärben

Beitrag von fliegermichl »

Da ist allerdings was dran. Die Lazarus Komponenten haben mMn. riesen Fortschritte gemacht.

Ronny58
Beiträge: 82
Registriert: So 27. Apr 2014, 20:35

Re: Eye-Candy-Grid Zellen einfärben

Beitrag von Ronny58 »

Korrekt. Ich schmeiß die Komponente raus und nehme das Stringgrid.
TECGrid ist noch eine Altlast in meinem Komponenten-Portfolio, da ich bis vor kurzem noch mit einer sehr, sehr alten Lazarus-Version gearbeitet habe.
Die Version, die ich jetzt einsetze lässt in den Komponenten kaum noch Wünsche offen.

Danke für Eure Beiträge zu meiner Frage.

Antworten