Настройка нескольких ярлыков на прозрачность в 1.000 формах?

Я снял свое программное обеспечение с помощью Devexpress, и я обнаружил, что метки не прозрачны, что приводит к тому, что они имеют серый фон.

Просто бесконечные формы, поэтому мне было интересно, есть ли способ сделать эту задачу (установить ярлыки на прозрачные) автоматически.

Я сделал аналогичную вещь раньше, элемент управления Devexpress на форме имел LookAndFeel.NativeStyle = True, я использовал Grep Search, чтобы заменить его на False во всех формах dfm. Однако в случае с меткой прозрачного свойства нет.

Спасибо.

Ответы

Ответ 1

Глобальная переменная Screen отслеживает все формы:

procedure MakeLabelsTransparent(AParent: TWinControl);
var
  I: Integer;
begin
  with AParent do
    for I := 0 to ControlCount - 1 do
      if Controls[I] is TLabel then
        TLabel(Controls[I]).Transparent := True
      else if Controls[I] is TWinControl then
        MakeLabelsTransparent(TWinControl(Controls[I]));
end;

procedure TMainForm.ActiveFormChange(Sender: TObject);
begin
  with Screen do
    if (ActiveCustomForm <> nil) and (ActiveCustomForm.Tag = 0) then
    begin
      MakeLabelsTransparent(ActiveCustomForm);
      ActiveCustomForm.Tag := 1;
    end;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  Screen.OnActiveFormChange := ActiveFormChange;
end;

И если вам нужно использовать свойство Tag для конкретной формы, пропустите эту проверку: на самом деле это не будет намного медленнее.

Ответ 2

Для этого типа задач GExperts содержит инструмент Установить свойства компонентов:

Этот инструмент ждет в фоновом режиме пока вы не скомпилируете проект. Тогда сканирует текущие формы проекта на проверять компоненты с определенными свойства и изменения свойства к определенному значению. Эта инструмент полезен для деактивации наборов данных или подключения к базам данных перед вами скомпилируйте свои приложения, но для любых аналогичных ситуаций, таких как Что ж. Чтобы активировать сканирование, установите флажок рядом с этим эксперт в конфигурации GExperts экран.

Его можно использовать для установки свойства, которое еще не находится в DFM, и требуется только одна дополнительная запись в конфигурации GExpert и перекомпиляция.

Я только что протестировал его и работает как ожидалось.

Ответ 3

Во время разработки вы можете просто проанализировать все .dfm, а затем добавить

  Transparent = True

сразу после любого

  object MyLabel : TLabel

строка.

Во время выполнения вы можете переопределить методы TCustomForm.DoCreate и TCustomFrame.Create, как таковые:

type
  THookedForm = class(TCustomForm)
    procedure HookedDoCreate;
  end;

  THookedFrame = class(TCustomFrame)
    constructor Create(AOwner: TComponent); override;
  end;

var
  PatchForm, OriginalForm: TPatchEvent;
  PatchPositionForm: PPatchEvent = nil;
  PatchFrame, OriginalFrame: TPatchEvent;
  PatchPositionFrame: PPatchEvent = nil;

procedure PatchCreate;
var ov: cardinal;
begin
  // hook TForm:
  PatchPositionForm := PPatchEvent(@THookedForm.DoCreate);
  OriginalForm := PatchPositionForm^;
  PatchForm.Jump := $E9; // Jmp opcode
  PatchForm.Offset := PtrInt(@THookedForm.HookedDoCreate)-PtrInt(PatchPositionForm)-5;
  if not VirtualProtect(PatchPositionForm, 5, PAGE_EXECUTE_READWRITE, @ov) then
    RaiseLastOSError;
  PatchPositionForm^ := PatchForm; // enable Hook
  // hook TFrame:
  PatchPositionFrame := PPatchEvent(@TCustomFrame.Create);
  OriginalFrame := PatchPositionFrame^;
  PatchFrame.Jump := $E9; // Jmp opcode
  PatchFrame.Offset := PtrInt(@THookedFrame.Create)-PtrInt(PatchPositionFrame)-5;
  if not VirtualProtect(PatchPositionFrame, 5, PAGE_EXECUTE_READWRITE, @ov) then
    RaiseLastOSError;
  PatchPositionFrame^ := PatchFrame; // enable Hook
end;

{ THookedForm }

procedure THookedForm.HookedDoCreate;
var i: integer;
begin
  // enumerate all labels, then set Transparent := true
  for i := 0 to Components.Count-1 do
    if Components[i] is TLabel then
      TLabel(Components[i]).Transparent := true;
  DoCreate; // call initial code
end;

{ THookedFrame }

constructor THookedFrame.Create(AOwner: TComponent);
var i: integer;
begin
  // enumerate all labels, then set Transparent := true
  for i := 0 to Components.Count-1 do
    if Components[i] is TLabel then
      TLabel(Components[i]).Transparent := true;
  inherited Create(AOwner); // call normal constructor
end;

....

initialization
  PatchCreate;

Ответ 4

Связанный отзыв (я всегда забываю использовать эту удобную функцию):

  • Настройте ярлык так, как вы хотите его использовать;
  • Выберите его в форме;
  • Перейдите к Component/Create component template;
  • Затем вы можете указать имя шаблона:

enter image description here

С этого момента шаблон отображается как новый тип компонента в вашей палитре инструментов с настройками, которые вы предпочитаете.

(Да, я знаю, что это не меняет текущие метки)

Ответ 5

Вы можете установить для свойства BackColor значение Color.Transparent.

Ответ 6

Следующее должно работать: прозрачное свойство присутствует в DFM файле, только если значение не является значением по умолчанию. Таким образом, вы можете нам Grep-Search вставить "Transparent = TRUE" только в следующей строке после "= TLabel". Я не пробовал это сам, но легко попробовать...