powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi. Смена цвета фонта в disabled control
20 сообщений из 20, страница 1 из 1
Delphi. Смена цвета фонта в disabled control
    #40071813
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ciao a tutti!

А кто-нибудь может знает, как красиво и изящно решить скорее всего нерешаемое: изменить цвет фонта у контрола, который в состоянии Enabled := false?

1. Ни в какой контейнер (TPanel и др.) контролы не хочу помещать.
2. Ставить сторонние компоненты нежелательно, так как никто не хочет потом у себя доустанавливать. Разработка таки коллективная.
3. В крайнем случае можно переопределить метод WMPaint - видимо это самое простое. Но компонент не TEdit, а TrzNumericEdit. Первая попытка уже была, работает, но криво. А надо, чтоб не криво... Компонент наследуется от .......TMaskEdit и дальше от TWinControl.... далее методы отрисовки уходят в WinAPI....... контролы - это окна и винда их рисует, как окна...
Исходников RaizeComponent чего-то нету у меня, посмотреть, что там и как пока что не получается... А хотелось бы...

Может еще какие варианты есть?

Только желательно по делу, а не как обычно.
...
Рейтинг: 0 / 0
Delphi. Смена цвета фонта в disabled control
    #40071818
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариантов два:
1. Искать исходники
2. Написать всё самим

PS:
бонусный вариант - не маяться дурью
...
Рейтинг: 0 / 0
Delphi. Смена цвета фонта в disabled control
    #40071837
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Delphi. Смена цвета фонта в disabled control
    #40071851
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger
Вариантов два:
1. Искать исходники
2. Написать всё самим

PS:
бонусный вариант - не маяться дурью


За бонус согласен, но вот хотят именно так :(
...
Рейтинг: 0 / 0
Delphi. Смена цвета фонта в disabled control
    #40071853
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник


о спасибо! посмотрел втуда. Вот чего нашел втам:
"Read-only or disabled edit controls do not send the WM_CTLCOLOREDIT message; instead, they send the WM_CTLCOLORSTATIC message."
Значит надо курить в сторону WM_CTLCOLORSTATIC!

Thanks!
...
Рейтинг: 0 / 0
Delphi. Смена цвета фонта в disabled control
    #40071920
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galadriel75
Значит надо курить в сторону WM_CTLCOLORSTATIC!
Это если в тех компонентах используется системный подход для задания цвета. Без сырцов - игра в угадайку, но есть шанс что прокатит. Кстати, а в самих компонентах Raize нет ничего для этого, или для отрисовки?
...
Рейтинг: 0 / 0
Delphi. Смена цвета фонта в disabled control
    #40071926
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Delphi. Смена цвета фонта в disabled control
    #40071946
kapas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Galadriel75, см. http://delphimaster.net/view/1-1124453135/all (ого 2005 г. !)
...
Рейтинг: 0 / 0
Delphi. Смена цвета фонта в disabled control
    #40071968
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger
Galadriel75
Значит надо курить в сторону WM_CTLCOLORSTATIC!
Это если в тех компонентах используется системный подход для задания цвета. Без сырцов - игра в угадайку, но есть шанс что прокатит. Кстати, а в самих компонентах Raize нет ничего для этого, или для отрисовки?


Вроде как нету. Или я не нашел. Но скорее всего нету. До меня тоже уже искали.
...
Рейтинг: 0 / 0
Delphi. Смена цвета фонта в disabled control
    #40071970
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr


Раз сам Рэй сказал делать наследника, значит так тому и быть! Спасибо за ссылку!
...
Рейтинг: 0 / 0
Delphi. Смена цвета фонта в disabled control
    #40071975
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kapas
Galadriel75, см. http://delphimaster.net/view/1-1124453135/all (ого 2005 г. !)


Да, я видел этот пример и попробовал. Он не работает, как надо:
Затирает белым фоном все подряд вместе с бордюром.
Куча артефактов.
...
Рейтинг: 0 / 0
Delphi. Смена цвета фонта в disabled control
    #40071988
kapas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Galadriel75, не понял. У мня такая картинка
...
Рейтинг: 0 / 0
Delphi. Смена цвета фонта в disabled control
    #40072073
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kapas
Galadriel75, не понял. У мня такая картинка


На тестовом проекте у меня тоже все отлично! Ну, прям аж на душе полегчало. Думал, решил задачу. И принялся переносить все на боевой. Создал компонентик-наследник TRzNumericEditExt, заменил им TRzNumericEdit. И получил компоненты без границ - они все склеились в один, так как между ними малое совсем расстояние. На формочке они изначально плотненько практически были - форма до меня спроектирована, менять я там ничего не могу. Цифры были смещены все влево, а должны быть справа. И это неудивительно - там есть вывод текста, начиная слева.
Тем не менее, все остальное работает! Если не выйдет сделать как-то иначе придется пилить эту версию. Текст посадить вправо таки вообще не проблема! И останется понять, почему на тестовом все хорошо, а на боевом - все плохо. На боевом еще дополнительные всякие украшательства используются, стили. Возможно, они и подмешивают артефакты. На тестовом - просто голая форма и на ней компоненты. А в реальном проекте просто лавина всяких стилей отрисовки...
...
Рейтинг: 0 / 0
Delphi. Смена цвета фонта в disabled control
    #40072122
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таки сделал обработчик WM_CTLCOLORSTATIC
Ну, примерно вот как
Код: pascal
1.
2.
3.
4.
SetTextColor(Message.WParam, ColorToRGB(fFontColor));
SetBkColor(Message.WParam, ColorToRGB(clGrayText));
// SetBkMode(Message.WParam, TRANSPARENT);
Message.Result := LRESULT(Brush.Handle);



Ключевое здесь - костыль. Без него не будет работать!:
Код: pascal
1.
SetBkColor(Message.WParam, ColorToRGB(clGrayText));


Костыль нарисовал благодаря тому, что по исходникам винды сразу и видно, что если цвет фона совпадает с цветом задизабленного фонта, то винда только в этом случае любезно оный цвет фонтовый и позволяет изменить, а иначе и никак!
Спасибо всем добрым и умным людям за помощь!

...
Рейтинг: 0 / 0
Delphi. Смена цвета фонта в disabled control
    #40078304
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ciao a tutti!

И вот неожиданно продолжение темы....



А на панели, как оказалось, не меняет цвет... Хотя вроде панель в окне живет... Вот облом так облом. Я не знаю, как разрулить это попроще. Нагуглил такого, что не уверен, что решение правильное...

Вот такой код

Код: pascal
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.
unit unit_Test;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Vcl.StdCtrls, Vcl.Mask, RzEdit, Vcl.ExtCtrls{, RzNumericEditExt}, TypInfo,
  ActnList, Contnrs, dxCore, dxCoreClasses, dxMessages, dxCommon, dxThemeManager,
  cxLookAndFeels, cxLookAndFeelPainters, cxControls, cxContainer, cxClasses,
  cxGraphics, cxStyles, dxFading, cxAccessibility, cxLibraryConsts, dxCustomHint,
  dxScreenTip, VCL.Themes;

type
  TForm2 = class(TForm)
    Button1: TButton;
    edt1: TRzNumericEdit;
    edt2: TRzNumericEdit;
    edt3: TRzNumericEdit;
    edt4: TRzNumericEdit;
    edt5: TRzNumericEdit;
    edt6: TRzNumericEdit;
    pnl1: TPanel;
    edt7: TRzNumericEdit;
    edt8: TRzNumericEdit;
    edt9: TRzNumericEdit;
    edt10: TRzNumericEdit;
    edt11: TRzNumericEdit;
    edt12: TRzNumericEdit;
    edt13: TRzNumericEdit;
    edt14: TRzNumericEdit;
    procedure Button1Click(Sender: TObject);
  private
    fFontColor: TColor;
    procedure WndProc(var Message: TMessage); override;
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
var
  I: Integer;
  c: TRzNumericEdit;
begin

  if fFontColor <> clRed then
    fFontColor := clRed
  else
    fFontColor := clGreen;

  for I := 0 to Pred(self.ControlCount) do
  begin

    if self.Controls[I] is TRzNumericEdit then
    begin
      c := self.Controls[I] as TRzNumericEdit;
      c.Enabled := false;
      case fFontCOlor of
        clRed:
          c.Text := 'RED RED RED!';
        clGreen:
          c.Text := 'Green Green Green!';
      end;
    end;
  end;
//  Invalidate;

end;

procedure TForm2.WndProc(var Message: TMessage);

  function FindEditControl(AHandle: HWND): TRzNumericEdit;
  var
    AEditControl: TRzNumericEdit;
    I: Integer;
  begin
    Result := nil;
    for I := 0 to self.ControlCount - 1 do
      if self.Controls[I] is TRzNumericEdit then
      begin
        AEditControl := TRzNumericEdit(self.Controls[I]);
        if AEditControl.HandleAllocated and (AEditControl.Handle = AHandle) then
        begin
          Result := AEditControl;
          Break;
        end;
      end;
  end;

var
  AEditControl: TRzNumericEdit;
begin
  case Message.Msg of
    WM_CTLCOLOREDIT, WM_CTLCOLORSTATIC: //don't use VCL-like method
      begin
        AEditControl := FindEditControl(Message.LParam);
        if AEditControl = nil then
          inherited
        else
        begin
          SetTextColor(Message.WParam, ColorToRGB(fFontColor));
          SetBkColor(Message.WParam, ColorToRGB(clGrayText));
         // SetBkMode(Message.WParam, TRANSPARENT);
          Message.Result := LRESULT(Brush.Handle);
        end;
      end;
  else
    inherited;
  end;
end;


...
Рейтинг: 0 / 0
Delphi. Смена цвета фонта в disabled control
    #40078365
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galadriel75,

А что непонятного во фразе:
авторA static control, or an edit control that is read-only or disabled, sends the WM_CTLCOLORSTATIC message to its parent window when the control is about to be drawn.

Как вариант - сделай глобальный обработчик в Application.OnMessage.
...
Рейтинг: 0 / 0
Delphi. Смена цвета фонта в disabled control
    #40078368
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Galadriel75,

А что непонятного во фразе:
авторA static control, or an edit control that is read-only or disabled, sends the WM_CTLCOLORSTATIC message to its parent window when the control is about to be drawn.


Как вариант - сделай глобальный обработчик в Application.OnMessage.


ОООООО, спасибо!!! Попробую!
Вся моя беда в том, что я НЕ ЧИТАЮ доку!
Во фразе таки понятно все до последней буквы, даже без словаря! Но я ж не читатель :(
...
Рейтинг: 0 / 0
Delphi. Смена цвета фонта в disabled control
    #40079188
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вроде что-то вышло....



Немного причешу код, попробую понять, что я сделал и выложу сюда. Может кому-то пригодится, может кто замечания по делу скажет...
...
Рейтинг: 0 / 0
Delphi. Смена цвета фонта в disabled control
    #40079263
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galadriel75,

посмотрите TWinControl.DefaultHandler

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
      case Msg of
        WM_CTLCOLORMSGBOX..WM_CTLCOLORSTATIC:
          Result := SendMessage(LParam, CN_BASE + Msg, WParam, LParam);
        CN_CTLCOLORMSGBOX..CN_CTLCOLORSTATIC:
          begin
            SetTextColor(WParam, ColorToRGB(FFont.Color));
            SetBkColor(WParam, ColorToRGB(FBrush.Color));
            Result := LRESULT(FBrush.Handle);
          end;


он возвращает сообщение контролу как CN_CTLCOLORSTATIC = CN_BASE + WM_CTLCOLORSTATIC;

видно, что DefaultHandler с CN_CTLCOLORSTATIC делает как у вас, значит кто-то в компоненте пошаманил с CN_CTLCOLORSTATIC, либо в стилях что-то не так
...
Рейтинг: 0 / 0
Delphi. Смена цвета фонта в disabled control
    #40079304
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
Galadriel75,

посмотрите TWinControl.DefaultHandler

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
      case Msg of
        WM_CTLCOLORMSGBOX..WM_CTLCOLORSTATIC:
          Result := SendMessage(LParam, CN_BASE + Msg, WParam, LParam);
        CN_CTLCOLORMSGBOX..CN_CTLCOLORSTATIC:
          begin
            SetTextColor(WParam, ColorToRGB(FFont.Color));
            SetBkColor(WParam, ColorToRGB(FBrush.Color));
            Result := LRESULT(FBrush.Handle);
          end;


он возвращает сообщение контролу как CN_CTLCOLORSTATIC = CN_BASE + WM_CTLCOLORSTATIC;

видно, что DefaultHandler с CN_CTLCOLORSTATIC делает как у вас, значит кто-то в компоненте пошаманил с CN_CTLCOLORSTATIC, либо в стилях что-то не так


оки,спасибо, гляну!
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi. Смена цвета фонта в disabled control
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]