Autor Beitrag
Sybok Factor
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50
Erhaltene Danke: 5

Win XP, Win Vista
Delphi 2010 Professional
BeitragVerfasst: Mi 20.04.11 13:30 
Hallo!

in einem DBDrid im Ereignis OnDrawColumnCell den kompletten Text im Feld einzufärben ist kein Problem, aber gibt es auch die Möglichkeit einen Teilstring andersfarbig zu markieren?
Der Hintergrund ist die Visualisierung eines Suchergebnisses, also z.B. so Suchbegriff "Syb" im Grid dann "Sybok Factor".

Vielen Dank

Sybok Factor


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mi 20.04.2011 um 14:33

_________________
Jetzte michse verstehen dein Problem.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19338
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 20.04.11 13:43 
Naja, du musst eben die beiden Teile des Textes einzeln zeichnen. Du kannst mit Canvas.TextWidth ja feststellen wie breit die jeweils sind, damit du beides nebeneinander positionieren kannst.

Für diesen Beitrag haben gedankt: BenBE, Sybok Factor
LSanchez
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26
Erhaltene Danke: 8



BeitragVerfasst: Mi 20.04.11 15:07 
Hallo,

hier bekommst du etwas Code (Teil von meiner HighlightText-Komponente ).

Du kannst mehrere Suchbegriffe (mit Leerzeichen getrennt) einfärben z.B Syb und Fact => Suchbegriff ist 'Syb Fact'

In dem Ereignis OnDrawColumnCell verwende die Prozedur MarkupTextOut :

MarkupTextOut(TDBGrid(Sender).Canvas, Rect, 'Syb', Column.Field.AsString)

Gruß

L. Sanchez

Code:
ausblenden volle Höhe 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:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
function Get_Text_FuerEineDefinierteBreite(pcanvas: TCanvas;
                                           ptext: String;
                                           pbreite: integer): String;
var lStringLaenge:Integer;

begin
    while pCanvas.TextWidth(pText) > pBreite do
    begin
        lStringLaenge := Length(pText);
        if lStringLaenge > 1
        then pText := Copy(pText, 1, lStringLaenge-1)
        else
        begin
            pText := '';
            break;
        end;
    end;
    Result := pText;
end;

procedure Erzeuge_SuchWortListe(pSuchWoerter: Stringvar pSuchWortListe:TStrings);
var Pos_Leer:Integer;
    S, TextFilter, lSuchWoerter:String;
    lLength:integer;
begin
     pSuchWortListe.Clear;
     S := AnsiUpperCase(pSuchWoerter);
     // ********************************
     // Ermittlung der Suchwort-Liste
     // ********************************
     Pos_Leer := Pos(' ', S);
     while Pos_Leer > 0 do
     begin
         TextFilter := TRIM(Copy(S, 1, Pos_Leer));
         if TextFilter <> '' then
          pSuchWortListe.Add(TextFilter);
         S := TRIM(Copy(S, Pos_Leer, lLength));
         Pos_Leer := Pos(' ', S);
     end;
     if s <> '' then
        pSuchWortListe.Add(S);
end;

function Get_Markierungsmaske(pSuchwortListe: TStrings;
                              pText: String): String;
var i, j, lLaenge, lSuchwortlaenge:Integer;
    lTextUpperCase, lHelpText, lMarkierungsmaske:String;
    Pos_start: Integer;
    Pos_Ende: Integer;
begin
     // *****************************************************************************
     // Result is ein String in der Form 0000001110100000111000, 1=markiertes Zeichen
     // *****************************************************************************
     lTextUpperCase := AnsiUpperCase(pText);
     lLaenge := Length(lTextUpperCase);
     lMarkierungsmaske := DupeString('0', lLaenge);
     // ***************************************
     // Für alle Einträge der Suchwort-Liste
     // ***************************************
     for i:= 0 to (pSuchwortListe.Count - 1do
     begin
          lSuchwortlaenge := Length(pSuchwortListe[i]);
          lHelpText:= lTextUpperCase;
          Pos_Start := Pos(pSuchwortListe[i], lHelpText);
          while Pos_Start > 0 do
          begin
            for j:= 0 to (lSuchwortlaenge  - 1do
                lMarkierungsmaske[Pos_Start + j] := '1';
            Pos_Ende := Pos_Start + lSuchwortlaenge;
            lHelpText := DupeString(' ', Pos_Ende - 1) + Copy(lHelpText, Pos_Ende, lLaenge);
            Pos_Start := Pos(pSuchwortListe[i], lHelpText);
          end;
     end;
     Result := lMarkierungsmaske;
end;

procedure Write(pCanvas: TCanvas;
                pX, pY: integer;
                pSuchwoerter, pText: String;
                pHighlightColor,
                pTextColor: TColor);
    function WriteText(iCanvas:TCanvas; iBkColor, iTextColor:cardinal; iText: String): String;
    begin
        SetBkColor(iCanvas.handle, iBkColor);
        SetTextColor(iCanvas.handle,iTextColor);
        TextOut(iCanvas.handle,0,0,pchar(iText),Length(iText));
    end;
var i, lLaenge:Integer;
    lMarkierungsmaske, lMitMarkierung, lOhneMarkierung:String;
    lBkColor, lTextColor: cardinal;
    savedTextAlign, SavedBkColor, savedTextColor: cardinal;
    savedPt: TPoint;
    SuchwortListe:TStrings;
begin
     SuchwortListe := TStringList.Create;
     try
       Erzeuge_SuchWortListe(pSuchwoerter, SuchwortListe);
       if (TRIM(SuchWortListe.Text) = '')
       then
       begin
           pCanvas.TextOut(pX, pY, pText);
           exit;
       end;
       // ***************************************************************
       // String in der Form 0000001110100000111000, 1=markiertes Zeichen
       // ***************************************************************
       lMarkierungsmaske := Get_Markierungsmaske(SuchwortListe, pText);
       // Text-Länge
       lLaenge := Length(pText);
       // Falls es etwas zu markieren gibt
       if Pos('1', lMarkierungsmaske) > 0
       then
       begin
          lBkColor := ColorToRGB(pHighlightColor);
          lTextColor := ColorToRGB(pTextColor);

          SavedTextColor := GetTextColor(pCanvas.Handle);
          SavedBkColor := GetBkColor(pCanvas.handle);
          savedTextAlign := GetTextAlign(pCanvas.Handle);
          SetTextAlign(pCanvas.Handle, savedTextAlign or TA_UPDATECP);
          MoveToEx(pCanvas.Handle, pX, pY, @savedPt);

          lOhneMarkierung := '';
          lMitMarkierung := '';
          // Alle Zeichen des Textes werden überprüft
          for i:= 1 to lLaenge do
          begin
              // Zeichen ohne Markierung
              if lMarkierungsmaske[i] = '0'
              then
              begin
                  // Wir sind in einem markierten Bereich
                  if (lMitMarkierung <> '')
                  then
                  begin
                     // Der zu markierenden Text wird geschrieben
                     WriteText(pCanvas, lBkColor, lTextColor, lMitMarkierung);
                     // Keine Markierung mehr
                     lMitMarkierung := '';
                     lOhneMarkierung := '';
                  end;
                  lOhneMarkierung := lOhneMarkierung + pText[i];
              end
              // Zeichen mit Markierung
              else
              begin
                  // Wir sind in einem Bereich ohne Markierung
                  if (lOhneMarkierung <> '')
                  then
                  begin
                     // Der Text ohne Markierung wird geschrieben
                     WriteText(pCanvas, savedBkColor, savedTextColor, lOhneMarkierung);
                     // Keine Markierung mehr
                     lMitMarkierung := '';
                     lOhneMarkierung := '';
                  end;
                  lMitMarkierung := lMitMarkierung + pText[i];
              end;
          end;

          // letzte Zeichen schreiben
          if lMitMarkierung <> ''
          then WriteText(pCanvas, lBkColor, lTextColor, lMitMarkierung)
          else WriteText(pCanvas, savedBkColor, savedTextColor, lOhneMarkierung);

          SetTextColor(pCanvas.handle,savedTextColor);
          SetBkColor(pCanvas.handle, SavedBkColor);
          SetTextAlign(pCanvas.Handle, savedTextAlign);
          MoveToEx(pCanvas.Handle, savedPt.X, savedPt.Y, nil);
       end;
     finally
       SuchwortListe.Free;
     end;
end;

procedure MarkupTextOut(pCanvas: TCanvas;
                        pRect: TRect;
                        pSuchwoerter, pText: String;
                        pHighlightColor:TColor = $0080FF80;
                        pTextColor:TColor = clBlack);
var lText:String;
begin
    pCanvas.FillRect(pRect);
    lText := Get_Text_FuerEineDefinierteBreite(pCanvas,
                                               pText,
                                               pRect.Right - pRect.Left - 4);
    Write(pCanvas,
          pRect.Left+2,
          pRect.Top+2,
          pSuchwoerter,
          lText,
          pHighlightColor,
          pTextColor);
end;

Für diesen Beitrag haben gedankt: Sybok Factor
Sybok Factor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50
Erhaltene Danke: 5

Win XP, Win Vista
Delphi 2010 Professional
BeitragVerfasst: Mi 20.04.11 21:49 
@jaenicke: Das habe ich versucht, drei Canvas.TextOuts aber es wurde immer nur der komplette Text eingefärbt. Danke.
@LSanchez: Vielen Dank! Mit einer so umfangreichen Hilfe hatte ich nicht gerechnet. Ich habe dank Deines Postings und der Sourcen auch rausfinden können, warum mein Grid nicht färbte: Ich habe das DBGrid abgeleitet und OnDrawColumnCell überschrieben. Jetzt muss ich ein bißchen probieren, denn wenn Deine Einfärbung funktioniert, sind meine Änderungen verschwunden...
Also vielen Dank euch beiden, ihr habt mir sehr geholfen.

Viele Grüße, schöne Osterfeiertage

Sybok Factor

_________________
Jetzte michse verstehen dein Problem.
Sybok Factor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50
Erhaltene Danke: 5

Win XP, Win Vista
Delphi 2010 Professional
BeitragVerfasst: Mi 20.04.11 21:49 
@jaenicke: Das habe ich versucht, drei Canvas.TextOuts aber es wurde immer nur der komplette Text eingefärbt. Danke.
@LSanchez: Vielen Dank! Mit einer so umfangreichen Hilfe hatte ich nicht gerechnet. Ich habe dank Deines Postings und der Sourcen auch rausfinden können, warum mein Grid nicht färbte: Ich habe das DBGrid abgeleitet und OnDrawColumnCell überschrieben. Jetzt muss ich ein bißchen probieren, denn wenn Deine Einfärbung funktioniert, sind meine Änderungen verschwunden...
Also vielen Dank euch beiden, ihr habt mir sehr geholfen.

Viele Grüße, schöne Osterfeiertage

Sybok Factor

_________________
Jetzte michse verstehen dein Problem.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19338
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 20.04.11 22:02 
user profile iconSybok Factor hat folgendes geschrieben Zum zitierten Posting springen:
@jaenicke: Das habe ich versucht, drei Canvas.TextOuts aber es wurde immer nur der komplette Text eingefärbt.
Meinst du nicht, dass es am sinnvollsten gewesen wäre, einfach einmal den entsprechenden Quelltext zu posten?
Das war auch der Grund, dass ich nur relativ wenig allgemein dazu geschrieben hatte. Denn du musstest ja schon einiges haben, deshalb konnte niemand erraten wo das Problem liegen könnte...

user profile iconSybok Factor hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe das DBGrid abgeleitet und OnDrawColumnCell überschrieben.
OnDrawColumnCell? Wie meinst du das?
Hast du das Event OnDrawColumnCell zugewiesen (falsch, wenn du eine abgeleitete Klasse nutzen möchtest) oder hast du DrawColumnCell überschrieben (richtig)? :gruebel: