Настройка нескольких ярлыков на прозрачность в 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". Я не пробовал это сам, но легко попробовать...