Задать прозрачность нескольких ярлыков для 1000 форм? - PullRequest
13 голосов
/ 25 мая 2011

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

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

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

Спасибо.

Ответы [ 6 ]

14 голосов
/ 25 мая 2011

Глобальная переменная 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 для конкретной формы, тогда пропустите эту проверку: она не станет намного медленнее.

9 голосов
/ 25 мая 2011

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

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

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

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

5 голосов
/ 26 мая 2011

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

  1. Настройте метку так, как вы хотите, чтобы она была;
  2. Выберите ее в форме;
  3. Перейти к Component/Create component template;
  4. Затем вы можете назвать имя шаблона:

enter image description here

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

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

5 голосов
/ 25 мая 2011

Во время разработки вы можете просто проанализировать все .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;
1 голос
/ 25 мая 2011

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

1 голос
/ 25 мая 2011

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

...