Autor Beitrag
G'Kar
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 26.01.05 02:33 
Ist es möglich, die Windows System-Palette von einer Anwendung zu lösen und jedem Formular seine eigene
Palette zuzuweisen ????

Mich nervt es an, daß es nicht möglich ist, die Systempalette für eine Anwendung zu überschreiben bzw jeder Anwendun eine eigene Palette zuzuweisen (als ich bekomm's nicht hin). Ich hab zwar eine kleine Komponenete geschrieben, mit der zu Design- & Laufzeit die Systempalette geändert werden kann (hat allerdings auch Auswirkungen auf alle anderen Anwendungen).

Ich kann mir (irgendwie) nicht vorstellen, daß es nicht möglich sein soll. Man benötigt für alles eine Extra-Komponente (wenn man andere Farben haben möchte, sofern bei der ursprünglichen Komponente keine Möglichkeit dazu gegeben wird).

Hier die keine Quick'n'Dirty Komponente (die *.dcr kann sich ja jeder selber erstellen , wenn nötig)

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:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
UNIT SystemColors;

INTERFACE

USES
  SysUtils, Classes, Types, Windows, Graphics;

TYPE
  
  //** Standard Systempaletten-Konstanten als Typ**//

  TAllElements =(
                 CTL_MSGBOX,
                 CTL_EDIT,
                 CTL_LISTBOX,
                 CTL_BTN,
                 CTL_DLG,
                 CTL_SCROLLBAR,
                 CTL_STATIC,
                 CTL_MAX,
                 SCROLLBAR,
                 BACKGROUND,
                 ACTIVECAPTION,
                 INACTIVECAPTION,
                 MENU,
                 WINDOW,
                 WINDOWFRAME,
                 MENUTEXT,
                 WINDOWTEXT,
                 CAPTIONTEXT,
                 ACTIVEBORDER,
                 INACTIVEBORDER,
                 APPWORKSPACE,
                 HIGHLIGHT,
                 HIGHLIGHTTEXT,
                 BTNFACE,
                 BTNSHADOW,
                 GRAYTEXT,
                 BTNTEXT,
                 INACTIVECAPTIONTEXT,
                 BTNHIGHLIGHT,
                 DKSHADOW3D,
                 LIGHT3D,
                 INFOTEXT,
                 INFOBK,
                 HOTLIGHT,
                 GRADIENTACTIVECAPTION,
                 GRADIENTINACTIVECAPTION,
                 MENUHILIGHT,
                 MENUBAR);

CONST
  
  //** Standard Systempaletten-Konstanten **//
  
  CAllElements : ARRAY[TAllElements] OF DWORD=
                (
                 CTLCOLOR_MSGBOX,
                 CTLCOLOR_EDIT,
                 CTLCOLOR_LISTBOX,
                 CTLCOLOR_BTN,
                 CTLCOLOR_DLG,
                 CTLCOLOR_SCROLLBAR,
                 CTLCOLOR_STATIC,
                 CTLCOLOR_MAX,
                 COLOR_SCROLLBAR,
                 COLOR_BACKGROUND,
                 COLOR_ACTIVECAPTION,
                 COLOR_INACTIVECAPTION,
                 COLOR_MENU,
                 COLOR_WINDOW,
                 COLOR_WINDOWFRAME,
                 COLOR_MENUTEXT,
                 COLOR_WINDOWTEXT,
                 COLOR_CAPTIONTEXT,
                 COLOR_ACTIVEBORDER,
                 COLOR_INACTIVEBORDER,
                 COLOR_APPWORKSPACE,
                 COLOR_HIGHLIGHT,
                 COLOR_HIGHLIGHTTEXT,
                 COLOR_BTNFACE,
                 COLOR_BTNSHADOW,
                 COLOR_GRAYTEXT,
                 COLOR_BTNTEXT,
                 COLOR_INACTIVECAPTIONTEXT,
                 COLOR_BTNHIGHLIGHT,
                 COLOR_3DDKSHADOW,
                 COLOR_3DLIGHT,
                 COLOR_INFOTEXT,
                 COLOR_INFOBK,
                 COLOR_HOTLIGHT,
                 COLOR_GRADIENTACTIVECAPTION,
                 COLOR_GRADIENTINACTIVECAPTION,
                 COLOR_MENUHILIGHT,
                 COLOR_MENUBAR
                );



TYPE

  TElementsArray = ARRAY[TAllElements] OF TColor;

  TSystemColors = CLASS(TComponent)
  PRIVATE //is nothing
  PROTECTED
    FAllElementsCount         :WORD;
    FChangeColor              :TAllElements;
    FActualDisplayedColor     :TColor;
    FallElementsOldColor      :TElementsArray;
    FallElementsNewColor      :TElementsArray;
    FallElementsStore         :TElementsArray;
    FReset                    :BOOLEAN;
    PROCEDURE WriteChangeElement(Val:TAllElements);
    PROCEDURE WriteColor(Val:TColor);
    PROCEDURE ResetColors(Val:BOOLEAN);
  PUBLIC
    CONSTRUCTOR Create(AOwner:TComponent); OVERRIDE;
    PROCEDURE BeforeDestruction; OVERRIDE//!!! Wichtg & Richtig !!!
  PUBLISHED
    PROPERTY  ColorElement:TAllElements READ FChangeColor WRITE WriteChangeElement;
    PROPERTY  Color:TColor READ FActualDisplayedColor WRITE WriteColor;
    PROPERTY  RESET:BOOLEAN READ FReset WRITE ResetCOlors; //** Dummy-Property 
    PROCEDURE SetColor(Element:TAllElements;Col:TColor);
    PROCEDURE ReSetColor(Element:TAllElements);
    PROCEDURE ReSetAll;
    PROCEDURE Restore;
  END;


PROCEDURE Register;

IMPLEMENTATION

CONSTRUCTOR TSystemColors.Create(AOwner:TComponent);
VAR
  i   : WORD;
  pos : TAllElements;
BEGIN
  INHERITED Create(AOwner);
  FAllElementsCount := Length(CAllElements);
  //** Urspüngliche Palette sichern **//
  FOR i := 0 TO FAllElementsCount-1
  DO BEGIN
    pos := TAllElements(i);
    FallElementsOldColor[pos] := GetSysColor(CAllElements[pos]);
    FallElementsNewColor[pos] := FallElementsOldColor[pos];
  END;
  //** Initalisieungswerte setzten **//
  FChangeColor := CAPTIONTEXT;
  FActualDisplayedColor := FallElementsNewColor[FChangeColor];
END;

PROCEDURE TSystemColors.BeforeDestruction;
BEGIN
  ResetAll;
  INHERITED;
END;

PROCEDURE TSystemColors.ResetColors(Val:BOOLEAN);  //** Für Dummy-Property Palette zu Designtime zuücksetzten
BEGIN
  IF Val
  THEN BEGIN
    ReSetAll;
    FallElementsNewColor  := FallElementsOldColor;
    FActualDisplayedColor := FallElementsOldColor[FChangeColor];
  END;
  FReset := FALSE;
END;

PROCEDURE TSystemColors.WriteChangeElement(Val:TAllElements);  //** Property ColorElement Write
BEGIN
  FChangeColor          := Val;
  FActualDisplayedColor := FallElementsNewColor[FChangeColor];
END;

PROCEDURE TSystemColors.WriteColor(Val:TColor); //** Property Color Write
BEGIN
  FActualDisplayedColor               := Val;
  FallElementsNewColor[FChangeColor]  := Val;
  FallElementsStore[FChangeColor]     := Val;
  SetSysColors(1,CAllElements[FChangeColor],FallElementsNewColor[FChangeColor]);
END;

PROCEDURE TSystemColors.SetColor(Element:TAllElements;Col:TColor);  //** Runtime : Aufruf max alle 100ms
BEGIN
  WriteChangeElement(Element);
  WriteColor(Col);
END;

PROCEDURE TSystemColors.ReSetColor(Element:TAllElements); //** Runtime : Eine Farbe zuücksetzten
BEGIN
  SetColor(Element,FallElementsOldColor[ColorElement])
END;

PROCEDURE TSystemColors.ReSetAll; //** Runtime : Urspüngliche Patette Setzten und Aktuelle Sichern 
BEGIN
  FallElementsStore := FallElementsNewColor;
  SetSysColors(FAllElementsCount, CAllElements, FallElementsOldColor);
END;

PROCEDURE TSystemColors.Restore;  //** Runtime : Gesicherte Palette zuückholen
BEGIN
  FallElementsNewColor := FallElementsStore;
  SetSysColors(FAllElementsCount, CAllElements, FallElementsNewColor);
END;

PROCEDURE Register;
BEGIN
  RegisterComponents('Eigene Komponeneten', [TSystemColors]);
END;

END.


Aber bitte mit Vorsicht geniesen ! Wer Pech hat kann nichtsmehr erkennen (bei zuvielen Änderungen).


Aber zurück zum Problem. Hat einer einen Vorschlag?

MFG G'Kar

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.