Если вы недавно обновились с Delphi 6 до Rad Studio XE5, вы, возможно, столкнулись с проблемами, связанными с новой функцией VCL Styles. В данной статье мы рассмотрим решение двух основных проблем, с которыми вы можете столкнуться при использовании VCL Styles с FastReport 4.
Проблема 1: Белая граница вокруг панели инструментов
При использовании VCL Styles панель инструментов может получить белую границу вокруг нее. Чтобы решить эту проблему, вам нужно создать новый стилевой хоук и переопределить процедуру PaintNC, как показано в следующем коде:
type
TToolBarStyleHookEx = class(TToolBarStyleHook)
protected
procedure PaintNC(Canvas: TCanvas); override;
end;
{ TToolBarStyleHookEx }
procedure TToolBarStyleHookEx.PaintNC(Canvas: TCanvas);
var
Details: TThemedElementDetails;
LStyle: TCustomStyleServices;
R: TRect;
begin
if TToolBar(Control).BorderWidth > 0 then
begin
LStyle := StyleServices;
R := Rect(0, 0, Control.Width, Control.Height);
Details.Element := teToolBar;
Details.Part := 0;
Details.State := 0;
if LStyle.HasTransparentParts(Details) then
LStyle.DrawParentBackground(Handle, Canvas.Handle, Details, False);
LStyle.DrawElement(Canvas.Handle, Details, R);
end;
inherited;
end;
initialization
TCustomStyleEngine.RegisterStyleHook(TToolBar, TToolBarStyleHookEx);
Проблема 2: Неверное выравнивание или позиционирование элементов управления в диалоге печати и других элементах
При использовании VCL Styles элементы управления в диалоге печати и других элементах могут быть неверно выровнены или positioned. Для решения этой проблемы у вас есть три альтернативы:
Отредактируйте файл frxPrintDialog и увеличьте ширину формы.
Пatches для стилевого хоука формы.
Измените ширину диалога печати во время выполнения.
Вот пример кода, который меняет ширину диалога печати во время выполнения с помощью хоука HCBT_ACTIVATE:
var
hhk: HHOOK;
function CBT_FUNC(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
const
ClassNameBufferSize = 1024;
var
hWindow: HWND;
RetVal: Integer;
ClassNameBuffer: Array[0..ClassNameBufferSize-1] of Char;
i: integer;
begin
Result := CallNextHookEx(hhk, nCode, wParam, lParam);
if nCode < 0 then exit;
case nCode of
HCBT_ACTIVATE:
begin
hWindow := HWND(wParam);
if (hWindow > 0) then
begin
RetVal := GetClassName(wParam, ClassNameBuffer, SizeOf(ClassNameBuffer));
if (RetVal > 0) and SameText(ClassNameBuffer, 'TfrxPrintDialog') then
for i := 0 to Screen.FormCount - 1 do
if (SameText(Screen.Forms[i].ClassName, 'TfrxPrintDialog')) and (Screen.Forms[i].Width <= 563) then
Screen.Forms[i].Width := Screen.Forms[i].Width + 8;
end;
end;
end;
end;
Procedure InitHook();
var
dwThreadID: DWORD;
begin
dwThreadID := GetCurrentThreadId;
hhk := SetWindowsHookEx(WH_CBT, @CBT_FUNC, hInstance, dwThreadID);
if hhk = 0 then RaiseLastOSError;
end;
Procedure KillHook();
begin
if (hhk <> 0) then
UnhookWindowsHookEx(hhk);
end;
initialization
InitHook();
finalization
KillHook();
После применения обеих фикций результат будет следующим:
Обратите внимание, что вам следует сообщать об этих проблемах на странице QC Embarcadero (https://qc.embarcadero.com/).
В данном контексте рассматриваются решение проблем с VCL Styles в Rad Studio XE5, в частности, белая граница вокруг панели инструментов и неверное выравнивание или позиционирование элементов управления в диалоге печати и других элементах.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.