Autor Beitrag
Bastler
Hält's aus hier
Beiträge: 11
Erhaltene Danke: 1



BeitragVerfasst: Do 01.12.11 20:26 
Hallo Leute,

ich habe folgende Problemstellung:

Auf einem Formular werden diverse Komponenten gezeigt (StringGrid, Panels, Buttons, Labels etc.) und von einem Bediener benutzt, der in einem Fahrzeug sitzt. Nachts blendet die Darstellung auch noch, wenn man die Laptop-Helligkeit an den Anschlag runterdreht. Meine Vorstellung ist, auf Knopfdruck eine Nachtdarstellung zu bekommen. Nachtdarstellung soll bedeuten, dass die Inhalte des Formulars (durchgehend Schwarz/Weiss) invertiert werden (aus schwarz wird weiss und umgekehrt). Ich habe schon Experimente mit InvertRect angestellt. Bin aber unzufrieden, weil ich jede Komponente für sich invertieren müsste. Wenn man ein Panel drüberlegt und invertiert, kann man nichts mehr bedienen.

Jetzt meine Frage: Gibt es eine Methode einen kompletten Formularinhalt elegant zu invertieren (und wieder zurück)? wenn ja, welche Methode? (das Prog soll unter XP und Win7 laufen)

Danke schon jetzt für eure Tips!
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Di 13.12.11 12:52 
Es müsste funktionieren, wenn du alle Controls des Fensters durchläufst und dann jedes invertierst.
Tropby
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 71
Erhaltene Danke: 4

Vista, Win XP, Win 89
Turbo Delphi Ex.
BeitragVerfasst: Mi 14.12.11 11:25 
Hallo,

ich würde das ganze etwas anders lösen. Invertieren verfälscht ja schon sehr die Farben. Und ob es da gerade dunkler wird hängt von der Oberfläsche ab. Buttons selbst haben ja z.B. garkeinen Color Wert. Ich würde es wohl eher so lösen:

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:
private
  FDunkel : Boolean;
  function ChangeColor( Color : Integer; IsDark : Boolean ) : Integer;



function TForm1.ChangeColor( Color : Integer; IsDark : Boolean ) : Integer;
var r, g, b, a : Byte;
begin
  r := ( Color and $000000FF ) shr 0;
  g := ( Color and $0000FF00 ) shr 8;
  b := ( Color and $00FF0000 ) shr 16;
  a := ( Color and $FF000000 ) shr 24;

  if IsDark then
  begin
    r := r * 2;
    g := g * 2;
    b := b * 2;
  end
  else
  begin
    r := r div 2;
    g := g div 2;
    b := b div 2;
  end;

  result := Integer( r ) shl 0 + Integer( g ) shl 8 + Integer( b ) shl 16 + Integer( a ) shl 24;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
begin

  for I := 0 to self.ComponentCount - 1 do
  begin
    if Self.Components[ I ] is TPanel then
    begin
      TPanel( Self.Components[ I ] ).Color := ChangeColor( TPanel( Self.Components[ I ] ).Color, FDunkel );
      TPanel( Self.Components[ I ] ).Font.Color := ChangeColor( TPanel( Self.Components[ I ] ).Font.Color, FDunkel );
    end
    else if Self.Components[ I ] is TStringGrid then
    begin
      TStringGrid( Self.Components[ I ] ).FixedColor := ChangeColor( TStringGrid( Self.Components[ I ] ).FixedColor, FDunkel );
      TStringGrid( Self.Components[ I ] ).Color := ChangeColor( TStringGrid( Self.Components[ I ] ).Color, FDunkel );
      TStringGrid( Self.Components[ I ] ).Font.Color := ChangeColor( TStringGrid( Self.Components[ I ] ).Font.Color, FDunkel );
    end;
  end;

  Self.Color := ChangeColor( Self.Color, FDunkel );

  FDunkel := not FDunkel;

end;


Im Grunde wird jede Farbe halbiert. Man könnte auch noch anderes machen. Hierbei kann es aber sogar ganz kleine abweichungen bei der wieder hellmach rotine geben (Rundungsfehler).

Gruß
Tropby

_________________
Tropby

Für diesen Beitrag haben gedankt: Bastler
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Mi 14.12.11 11:32 
na wenn dimmen langt würde ich folgendes bevorzugen.
Ein neues duchklickbares, semitransparentes Form drüberlegen
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TDimmForm.FormCreate(Sender: TObject);
begin
  AlphaBlend := true;
  AlphaBlendValue := 128;
  Color := clBlack;
  BorderStyle := bsNone;
  WindowState := wsMaximized;

  FormStyle := fsStayOnTop;
  SetWindowLong(Handle, GWL_EXSTYLE, getWindowLong(Handle, GWL_EXSTYLE) or WS_EX_TRANSPARENT);
end;

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS

Für diesen Beitrag haben gedankt: Bastler
trm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: Fr 16.12.11 04:42 
Hallo,

eine andere Möglichkeit wäre, wenn Dein Programm die Farben vererbt und nicht für jedes Object eine eigene Farbe benutzt, die Form-Farben zu ändern.

Somit kannst Du

Form1.Color := clBlack;
Form1.Font.Color := clWhite;

nutzen und dies bei Bedarf zurücksetzen.


Schöner ist es allerdings mit Näherungen zu arbeiten, um Kontraste von Komplementärfarben besser zu erhalten, da die oftmals genannte Variante ( Komplementaer := ColorToRGB(Original) xor $FFFFFF; ) bei Graustufen nicht mehr funktioniert.

Probier es dann mal damit (gefunden auf www.delphigroups.info/2/10/314913.html):

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function GetGrayLevel(const Color: TColor): Integer;
begin
  Result := (77 * (Color and $FF) + 151 * (Color shr 8 and $FF) + 28 * Color shr 16 and $FFshr 8;
end;

function GetGoodContrast(const Color: TColor): TColor;
begin
  if GetGrayLevel(Color) < 128 then Result := clWhite
  else Result := clBlack;
end;


Verwendet werden kann das folgendermaßen:

ausblenden Delphi-Quelltext
1:
2:
Form1.Color := clBlack; //DeineNeueFarbe
Form1.Font.Color := GetGoodContrast(Form1.Color);


Viel Erfolg :)

_________________
In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege ;)

Für diesen Beitrag haben gedankt: Bastler
Bastler Threadstarter
Hält's aus hier
Beiträge: 11
Erhaltene Danke: 1



BeitragVerfasst: Fr 02.03.12 14:10 
Coole Beiträge. Danke! auf die Schnelle, konnte ich das transparente Fenster am einfachsten umsetzen. Die Vererbung werde ich mir mal ansehen!
trm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: Fr 02.03.12 14:32 
Na, das ging aber schnell mit Deiner Antwort :P

Schönes Wochenende :)

_________________
In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege ;)
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 02.03.12 17:10 
user profile iconBastler hat folgendes geschrieben Zum zitierten Posting springen:
Meine Vorstellung ist, auf Knopfdruck eine Nachtdarstellung zu bekommen.


Vielleicht wäre ja dieser Forenbeitrag etwas für dich: www.delphi-forum.de/...steuern_97212,0.html
Hier steht noch Genaueres: msdn.microsoft.com/e...2656%28VS.85%29.aspx