Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Проблемы с Width и Height при работе с OCX в Visual Basic 6.0 в Delphi

Delphi , Синтаксис , Ошибки и Исключения

Проблемы с Width и Height при работе с OCX в Visual Basic 6.0 в Delphi

Некоторые разработчики могут столкнуться с проблемой, когда Width и Height свойства OCX-контролов, созданных в Visual Basic 6.0, устанавливаются в нулевое значение при использовании их в Delphi. Эта проблема может возникнуть при переключении с более ранних версий Delphi, таких как Delphi 7, на newer версии, такие как Delphi 12.1.

Причина проблемы

Проблема может быть связана с High DPI-вычислениями для OCX-контролов в новых версиях Delphi. В некоторых случаях OCX-контролы не отвечают на вызов SetExtent(), что приводит к сбросу их размеров в нулевое значение в Delphi. Кроме того, ошибки, связанные с COM BSTR-параметрами, также могут вызывать эту проблему.

Решение проблемы

Оlaf Monien предложил решение этой проблемы в комментариях к вопросу. Он предложил изменить код в VCL.OleCtrls.pas, чтобы обработать случаи, когда OCX-контролы не отвечают на вызов SetExtent(). Ниже представлен фрагмент кода, который можно использовать для решения этой проблемы:

procedure TOleControl.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
var
  LRect: TRect;
  Temp: TPoint;
  LResult: HResult;
  LIsVisible: boolean;
begin
  if ((AWidth <> Width) and (Width >= 0)) or ((AHeight <> Height) and (Height >= 0)) then
  begin
    LResult := S_OK;
    LIsVisible := (FMiscStatus and OLEMISC_INVISIBLEATRUNTIME) = 0;
    //Only call SetExtent if control has visible UI at runtime
    if LIsVisible then
    begin
      Temp := Point(MulDiv(AWidth, 2540, Screen.PixelsPerInch),
                    MulDiv(AHeight, 2540, Screen.PixelsPerInch));
{$IFDEF WIN64}
      LResult := FOleObject.SetExtent(DVASPECT_CONTENT, @Temp);
{$ELSE}
      LResult := FOleObject.SetExtent(DVASPECT_CONTENT, Temp);
{$ENDIF}
    end;
    // UI won't respond to SetExtend, use default dimensions for design time
    if ((LResult <> S_OK) or (not LIsVisible)) then
    begin
      if (Height > 0) and (Width > 0) then
      begin
        AWidth := Height;
        AHeight := Width;
      end
      else
      begin
        AWidth := 25;
        AHeight := 25;
      end;
    end;
    if FOleInplaceObject <> nil then
    begin
      LRect := Rect(Left, Top, Left+AWidth, Top+AHeight);
      FOleInplaceObject.SetObjectRects(LRect, LRect);
    end;
  end;
  inherited SetBounds(ALeft, ATop, AWidth, AHeight);
end;

Альтернативное решение

Если вы не хотите вносить изменения в код Delphi, вы можете попробовать использовать более раннюю версию Delphi, такую как Delphi 7, для работы с OCX-контролами, созданными в Visual Basic 6.0. Этот подход может не быть идеальным, но он может помочь вам избежать проблем с Width и Height свойствами в новых версиях Delphi.

Заключение

Проблемы с Width и Height свойствами OCX-контролов в Visual Basic 6.0 в Delphi могут быть вызваны High DPI-вычислениями и ошибками, связанными с COM BSTR-параметрами. Решением этой проблемы может быть изменение кода в VCL.OleCtrls.pas или использование более ранней версии Delphi для работы с OCX-контролами.

Создано по материалам из источника по ссылке.

Проблема Width и Height при работе с OCX в Visual Basic 6.0 в Delphi связана с тем, что в новых версиях Delphi, такие как Delphi 12.1, High DPI-вычисления для OCX-контролов могут привести к сбросу их размеров в нулевое значение, что является результатом н


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Ошибки и Исключения ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 13:24:22/0.005946159362793/1