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 Pixelrahmen beim Markieren (StringGrid/Listbox) entfernen (https://www.delphipraxis.net/35777-pixelrahmen-beim-markieren-stringgrid-listbox-entfernen.html)

Nogge 11. Dez 2004 17:35


Pixelrahmen beim Markieren (StringGrid/Listbox) entfernen
 
Hallo Community,
ich möchte bei einer listbox oder bei einem striggrid den meiner meinung nach weniger schönen pixelrahmen, welcher beim markieren einer reihe entsteht, entfernen...nur wie?
benötige diesbezüglich eure hilfe...mfg Nogge

omata 12. Dez 2004 17:17

Re: Pixelrahmen beim Markieren (StringGrid/Listbox) entferne
 
Moin,

indem du alles selber zeichnest (OnDrawItem bzw. OnDrawCell).

Viel Spass...

MfG
Thorsten

Nogge 12. Dez 2004 21:21

Re: Pixelrahmen beim Markieren (StringGrid/Listbox) entferne
 
ich frage mich echt, warum sich die meisten leute so kurz fassen o_O dann brauchen solche personen erst gar nicht antworten (sry, omata^^)...
bin nun doch noch selber fündig geworden und poste die lösung für alle, die das gleiche problem haben:

Delphi-Quellcode:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
    if Index=Bedingung then begin  // Prüfen, welcher Index die Bedingung erfüllt
      Listbox1.Canvas.Brush.Color := clRed;   // Hintergrundfarbe auf Rot setzen
      Listbox1.Canvas.Font.Color := clYellow; // Schriftfarbe auf Grün setzen
    end;
    Listbox1.Canvas.FillRect(Rect);           // ausgewählten Index(bereich) färben
    Listbox1.Canvas.TextOut(Rect.Left,Rect.Top,Listbox1.Items[Index]);    // Text drüberpinseln
    if odFocused in State then DrawFocusRect(Listbox1.Canvas.Handle,Rect); // Pixelrahmen entfernen
end;

omata 12. Dez 2004 23:14

Re: Pixelrahmen beim Markieren (StringGrid/Listbox) entferne
 
Moin,

ich hänge mich sonst häufig in solche Probleme richtig rein. Und dann bekommt man hier nicht mal eine Reaktion. Das was du da rausgefunden hast, ist genau das was ich geschrieben habe (das OnDraw****-Ereignis benutzen)

MfG
Thorsten

Nogge 13. Dez 2004 13:21

Re: Pixelrahmen beim Markieren (StringGrid/Listbox) entferne
 
mir war schon klar, dass ich das OnDraw-ereignis benutzen muss. nur kann man in diese procedure allesmögliche hineinschreiben, wenn man keine ahnung hat ;-) ich musste mich jetzt sehr mühsam durch sehr viele sinnlose threads und seiten kämpfen, um "if odFocused in State then DrawFocusRect..." herauszufinden...
btw ich musste NICHT alles selber zeichnen! aber das ist ja jetzt egal...wollen uns jetzt ja nicht wegen solch einer belanglosen procedure streiten^^
trotzdem viel dank für deinen rat...Nogge

Nogge 19. Dez 2004 19:54

Re: Pixelrahmen beim Markieren (StringGrid/Listbox) entferne
 
ich habe jetzt gemerkt, dass die zeile "if odFocused in State then DrawFocusRect..." nur bei einer listbox funktioniert, nicht aber bei einem stringgrid ;_;
Benötige nun professionelle Hilfe von der kompetenten Community^^

mfg Nogge

Nogge 11. Okt 2005 12:39

Re: Pixelrahmen beim Markieren (StringGrid/Listbox) entferne
 
Hallo Community,
das, was ich vor knapp einem Jahr in der letzten Antwort dieses Threads geschrieben habe, stimmt nicht so ganz. DrawFocusRect funktioniert wunderbar, wenn goRowSelect deaktiviert ist. Allerdings möchte ich den Focusrahmen nun mit RowSelect entfernen können, woran ich bisher gescheitert bin ;_;

Benötige Eure Hilfe...Nogge

Keldorn 13. Okt 2005 16:14

Re: Pixelrahmen beim Markieren (StringGrid/Listbox) entferne
 
Hallo

das geht nicht. da das Focusrect immer wieder gemalt wird, wirst du so nicht froh, spätestens beim scrollen hakt es. Stell defaultdraw auf false und zeichne das Grid komplett selber. Das 3D-Aussehen der fixedcells ist auch nicht schwer, dafür gibt es Frame3D.

Codeschnippsel:
Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  with Sender as TStringGrid do
    begin
      if (gdfixed in State) then
        begin
          canvas.Brush.Color:=FixedColor;
          canvas.FillRect(rect);
          if Ctl3D then
         //wenn Fixed color nicht geändert wurde und den Standard-win-einstellungen =clbtnface entspricht,
           Frame3D(canvas,
                  rect,
                  clBtnHighlight,
                  clBtnShadow,
                  1);
          //sonst
          //uses graputil
{          Frame3D(canvas,
                  rect,
                  GetHighLightColor(FixedColor),
                  GetShadowColor(FixedColor),
                  1);}
        end
       else
       //wenn selektiert
        if (gdselected in State) then
          ...
          //Brush auf clhighlight setzen und hier halt keinen focusrahmen zeichnen
        else
          //normal zeichnen
          ...
          //brush auf Clwindow, bzw Color des Grid setzen

      //und irgendwann den Text, oder gleich drawtext verwenden
      canvas.textout(rect.left+2,rect.Top+2,cells[acol,arow]);
    end;
end;
Mfg Frank

Nogge 14. Okt 2005 11:21

Re: Pixelrahmen beim Markieren (StringGrid/Listbox) entferne
 
Vielen Dank, Keldorn! Ich kannte die property DefaultDrawing bisher gar nicht. Du hast mir damit sehr weitergeholfen.


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