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 Nieder mit dem Stringgrid-Fokus (https://www.delphipraxis.net/86437-nieder-mit-dem-stringgrid-fokus.html)

JPSelter 14. Feb 2007 10:09


Nieder mit dem Stringgrid-Fokus
 
Ich habe hier ein Stringgrid, wo ich gerne den Fokus weg hätte. Wenn im Stringgrid keine Einträge sind, ist ja alles ok, aber sobald ich Inhalt einfüge färbt er mir die Zelle 1/1 so ein, dass die Schrift nicht lesbar ist. Klicke ich dann auf das Stringgrid, ist die Schrift wieder lesbar. Die Hintergrundfarbe ändert sich dabei nicht. Ich habe da teils gelb und teils hellrot drin, mit weißer Schrift sieht man da nicht mehr viel, sie sollte aber schwarz sein. Liegt es überhaupt am Fokus?

http://www.ditonovia.de/misc/delphi.jpg

TonyR 14. Feb 2007 10:32

Re: Nieder mit dem Stringgrid-Fokus
 
Ich kann das Problem bei mir nicht reproduzieren...
Warum verwendest du dort überhaupt solche... ulkigen rosa Färbchen????

JPSelter 14. Feb 2007 10:47

Re: Nieder mit dem Stringgrid-Fokus
 
Wenn jeder erst seine Programme komplett erklären müsste, würde das Forum vor Infos überschwappen. Daher redet man meistens nur über das Kernproblem und nicht über den Zweck solcher Farben. Das hat alles schon seinen Sinn...

Ich habe noch diesen Code hier:

Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if ARow>0 then
  begin
    case StringGridColorArray[ARow] of
      0: StringGrid1.Canvas.Brush.Color := $00DDE2FB;
      1: StringGrid1.Canvas.Brush.Color := $00E0FFFF;
      2: StringGrid1.Canvas.Brush.Color := $00C6FBDA;
    else
      StringGrid1.Canvas.Brush.Color := clWindow;
    end;
    StringGrid1.Canvas.FillRect(Rect);
    StringGrid1.Canvas.TextOut(Rect.Left + 2, Rect.Top + 1, StringGrid1.Cells[ACol, ARow]);
  end;
end;
Vielleicht ist da etwas nicht ganz richtig.

TonyR 14. Feb 2007 11:00

Re: Nieder mit dem Stringgrid-Fokus
 
Weist du was ich vermute???

Wenn man etwas markiert, ist es gewöhnlich "blau"!
Und damit man den Text dann noch erkennt, wird der Text gewöhnlich "weiß"!

Das kannst du z.B. an den Symbol-Unterschriften auf dem Desktop erkennen.

Wenn du also die Markierungsfarbe änderst, dann bleibt aber die markierterText-Farbe noch weiß!!!

Das kann man ja auch im Darstellungs-Dialog deines Desktops einsehen!!!!

Sprich: Entweder du änderst dein rosa zu rot, oder du versuchst die markierteText-Farbe zu ändern!!!

TonyR 14. Feb 2007 11:05

Re: Nieder mit dem Stringgrid-Fokus
 
Was mir grad noch einfällt:

Ist es vielleicht möglich, dass du deinem stringgrid immer gleich wieder den Focus gibst, wenn es ihn z.B. nach einem ButtonClick verloren hat????
Delphi-Quellcode:
stringgrid1.SetFocus;

JPSelter 14. Feb 2007 11:11

Re: Nieder mit dem Stringgrid-Fokus
 
Danke für den Tip, es wird mit Sicherheit am (nicht vorhandenem) Markierungsblau liegen. Also muss ich die Markierungsschriftfarbe ändern. Um Deine Neugier zu bändigen: Es muss hell-rot (nicht rosa ;) ) sein, da rot zu stark ist und zu aggressiv wirkt. Die Software soll im Geschäftsumfeld eingesetzt werden. Da arbeitet man mit "seichten" Farben ;) Wenn da 10 Zeilen grell-rot sind, sieht das nicht schön aus.

JPSelter 27. Feb 2007 14:29

Re: Nieder mit dem Stringgrid-Fokus
 
So, da bin ich wieder. Ich musste dieses Thema erstmal ruhen lassen und mich um andere Dinge kümmern. Leider bekomme ich diese dumme Eigenschaft, wie oben auf den Screens gezeigt, nicht weg. Grund dafür ist einfach, dass das StringGrid immer oben-links-Zelle markiert. Das passiert auch mit jedem Minimalbeispiel, wenn man die Farben hier jetzt mal aussen vor lassen will. Also, die Frage besteht weiterhin: Wie bekomme ich die markierte Zelle da oben weg? Es ist ja anscheinend IMMER eine Zelle markiert.

hsg 27. Feb 2007 14:37

Re: Nieder mit dem Stringgrid-Fokus
 
Musst du unbedingt ein StringGrid nehmen? Alternativ würde sich der VirtualStringTree anbieten. Dort bist du in vielen Dingen freier und der markiert nicht grundsätzlich eine Zeile (was manchmal auch ein Problem sein kann :) )

Lannes 27. Feb 2007 15:48

Re: Nieder mit dem Stringgrid-Fokus
 
Hallo,

soll die Markierung nie angezeigt werden? Oder nur wenn das StringGrid nicht den Focus hat, denn dann muss man das noch extra betrachten.

Bzgl. der Schriftfarbe hat TonyR Dir schon den richtigen Tipp gegeben.

Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if ARow>0 then
  begin
    case StringGridColorArray[ARow] of
      0: StringGrid1.Canvas.Brush.Color := $00DDE2FB;
      1: StringGrid1.Canvas.Brush.Color := $00E0FFFF;
      2: StringGrid1.Canvas.Brush.Color := $00C6FBDA;
    else
      StringGrid1.Canvas.Brush.Color := clWindow;
    end;
    StringGrid1.Canvas.FillRect(Rect);
    StringGrid1.Canvas.Font.Color := StringGrid1.Font.Color;//<--- wg. der "negativ"-Schriftfarbe
    StringGrid1.Canvas.TextOut(Rect.Left + 2, Rect.Top + 1, StringGrid1.Cells[ACol, ARow]);
    //soll der Focusrahmen auch verschwinden, dann
    if gdFocused in State then
      StringGrid1.Canvas.DrawFocusRect(Rect);//<--- entfernt/übermalt per xor
  end;
end;

shmia 27. Feb 2007 16:12

Re: Nieder mit dem Stringgrid-Fokus
 
Grundsätzlich sollte die Textfarbe immer einen möglichst grossen Kontrast zur Hintergrundfarbe haben.
Du änderst zwar die Farbe des Hintergrunds, aber nicht die Farbe des Textes (Vordergrund).
Mit folgendem Code bleibt die Textfarbe im Kontrast zum Hintergrund
Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if ARow>0 then
  begin
    case StringGridColorArray[ARow] of
      0: StringGrid1.Canvas.Brush.Color := $00DDE2FB;
      1: StringGrid1.Canvas.Brush.Color := $00E0FFFF;
      2: StringGrid1.Canvas.Brush.Color := $00C6FBDA;
    else
      StringGrid1.Canvas.Brush.Color := clWindow;
    end;
    StringGrid1.Font.Color := BlackWhiteContrastColor(StringGrid1.Canvas.Brush.Color); // <====
    StringGrid1.Canvas.FillRect(Rect);
    StringGrid1.Canvas.TextOut(Rect.Left + 2, Rect.Top + 1, StringGrid1.Cells[ACol, ARow]);
  end;
end;
Code-Library: Kontrastfarbe ermitteln

WIng2005 18. Sep 2007 09:41

Re: Nieder mit dem Stringgrid-Fokus
 
Hallo,

kämpfe grad mit ähnlichen Problemen. Bei mir geht das sogar soweit, dass ich aufgrund einer sehr hellen
Hintergrundfarbe (des Grid) die weiße Schriftfarbe der Zelle nicht mehr erkennen kann. Habe festgestellt,
dass dieses Problem (bei mir zumindest) nur dann auftritt, wenn ich deas Windows-Farbscheme "Blau" gewählt habe.
Unter "Silber" ist noch alles lesbar. Die hier gebrachten Vorschläge beziehen sich doch eigentlich alle auf
den möglichst hohen Kontrast allgemein. Leider ändert sich die Schriftfarbe, wenn die Zelle focusiert ist
völlig unabhängig von der angegebenen Schriftfarbe. Wenn ich via OnDraw die Schriftfarbe explizit jedesmal
neu auf -schwarz- setze, dürfte auch im fokusierten Zustand keine -weiße- Farbe angezeigt werden....
oder liege ich da falsch? Die Frage ist doch also, wie die Farben verändert werden können, wenn die Zelle den Fokus hat.

MFG
Steffen

shmia 18. Sep 2007 10:05

Re: Nieder mit dem Stringgrid-Fokus
 
Man muss den Font-Color des Canvas ändern.
Das Font-Objekt des Stringgrids und das Font-Objekt des Canvas sind zwei verschiedene Dinge.
Delphi-Quellcode:
with StringGrid1.Canvas do
   Font.Color := BlackWhiteContrastColor(Brush.Color); // <====

SirThornberry 18. Sep 2007 10:06

Re: Nieder mit dem Stringgrid-Fokus
 
die herangehensweise ist falsche. Die Farbe von Schrift, Hintergrund und Selektierung richtet sich nach den Einstellungen des Nutzers. Wenn man so dreist ist die Einstellungen des Nutzers zu ignorieren muss man alle Farben ändern und sollte sich nicht darauf verlassen das der Nutzer bestimmte Einstellungen hat. Der Nutzer kann schließlich die Farben individuell einstellen wenn ihm danach ist.

WIng2005 18. Sep 2007 11:01

Re: Nieder mit dem Stringgrid-Fokus
 
:wall:
@shmia: das wars..., mein Fehler.

@SirThornberry: Sicher, da hast du recht. Ich benutze hier jedoch auch Farben, die ich im Unternehmen einheitlich haben will, also unabhängig von irgendwelchen Nutzereinstellungen... diese habe ich dann auch ALLE (ob das nun dreist ist, oder nicht) geändert. Hatte eben nur die Schriftfarbe falsch angesprochen...

MFG
Steffen

raiguen 18. Sep 2007 15:10

Re: Nieder mit dem Stringgrid-Fokus
 
Mal unabhängig von der ganzen Farbspielerei- wenn ich auf die Kernfrage=fokusierte Zelle(1|1) zurückkomme: wie wär's mit einem simplen
Zitat:

StringGrid1.Selection := TGridRect(Rect(-1,-1,-1,-1));
:?:

WIng2005 19. Sep 2007 07:18

Re: Nieder mit dem Stringgrid-Fokus
 
Sofern das Grid nur zur Darstellung von Informationen dient, kann das Sinn machen.
Mein Grid erlaubt ein "Tieferklicken", d.h. ich kann zu einzelnen Informationen per Click
Unterinformationen anzeigen. Somit ist immer eine Zeile (Rowselect auf True) fokusiert.

MFG
Steffen


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