Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Изменить параметр не меняя исходников чужой библиотеки  [new]
LiYing
Member

Откуда:
Сообщений: 495
В известной Graphics32 Library есть unit GR32_Backends_Generic с классом:
  TMemoryBackend = class(TCustomBackend)
  protected
    procedure InitializeSurface(NewWidth, NewHeight: Integer; ClearBuffer: Boolean); override;
    procedure FinalizeSurface; override;
  end;

...
procedure TMemoryBackend.InitializeSurface(NewWidth, NewHeight: Integer; ClearBuffer: Boolean);
begin
  GetMem(FBits, NewWidth * NewHeight * 4);
  if ClearBuffer then
    FillLongword(FBits[0], NewWidth * NewHeight, clBlack32); 
end;

Для своих нужд хочется использовать класс TMemoryBackend с измененным цветом с clBlack32 (=$FF000000) на $00000000. К примеру, TCustomBitmap32.Create() создает экземпляр с дефолтным бэкендом = TMemoryBackend. Вот чтобы он и дальше его создавал, но с измененным цветом.
Можно ли и как это сделать не меняя исходников, не закидывая модфицированный GR32_Backends_Generic.pas в папку своего проекта?
4 мар 19, 14:29    [21824415]     Ответить | Цитировать Сообщить модератору
 Re: Изменить параметр не меняя исходников чужой библиотеки  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 29635

унаследуйся и перекрой метод.
в чем проблема то?

Posted via ActualForum NNTP Server 1.5

4 мар 19, 14:34    [21824424]     Ответить | Цитировать Сообщить модератору
 Re: Изменить параметр не меняя исходников чужой библиотеки  [new]
LiYing
Member

Откуда:
Сообщений: 495
Мимопроходящий
унаследуйся и перекрой метод.
в чем проблема то?

Но я же не могу написать унаследованный класс как TMemoryBackend = class(TMemoryBackend). Или могу? Имя класса не должно поменяться, вот в чем затык...
4 мар 19, 14:44    [21824442]     Ответить | Цитировать Сообщить модератору
 Re: Изменить параметр не меняя исходников чужой библиотеки  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 29635

04.03.2019 14:44, LiYing пишет:
> Имя класса не должно поменяться

поцчему?

Posted via ActualForum NNTP Server 1.5

4 мар 19, 14:48    [21824446]     Ответить | Цитировать Сообщить модератору
 Re: Изменить параметр не меняя исходников чужой библиотеки  [new]
Vlad F
Member

Откуда:
Сообщений: 692
LiYing,

В относительно современных версиях Delphi появилась возможность в таких случаях достаточно элегантно выкручиваться через т.н. хелперы.
4 мар 19, 14:48    [21824447]     Ответить | Цитировать Сообщить модератору
 Re: Изменить параметр не меняя исходников чужой библиотеки  [new]
LiYing
Member

Откуда:
Сообщений: 495
Мимопроходящий
04.03.2019 14:44, LiYing пишет:
> Имя класса не должно поменяться

поцчему?

Это класс используется в недрах самой библиотеки. К примеру, в GR32.pas вызывается в
procedure TCustomBackend.ChangeSize(out Width, Height: Integer; NewWidth, NewHeight: Integer; ClearBuffer: Boolean);
begin
  try
    Changing;

    FinalizeSurface;

    Width := 0;
    Height := 0;

    if (NewWidth > 0) and (NewHeight > 0) then
      InitializeSurface(NewWidth, NewHeight, ClearBuffer);

    Width := NewWidth;
    Height := NewHeight;
  finally
    Changed;
  end;
end;

Написал свой перехватчик класса:
unit uGR32_Backends_Generic_MOD;

interface

uses
  GR32_LowLevel,
  GR32_Backends_Generic;

type
  TMemoryBackend = class(GR32_Backends_Generic.TMemoryBackend)
  protected
    procedure InitializeSurface(NewWidth, NewHeight: Integer; ClearBuffer: Boolean); override;
  end;

implementation


{ TMemoryBackend }

procedure TMemoryBackend.InitializeSurface(NewWidth, NewHeight: Integer; ClearBuffer: Boolean);
begin
  GetMem(FBits, NewWidth * NewHeight * 4);
  if ClearBuffer then
    FillLongword(FBits[0], NewWidth * NewHeight, $00000000); 
end;
end.

Добавил этот модуль после GR32_Backends_Generic, но все равно используется родной метод InitializeSurface, а не мой модфицированный.
Ничего нельзя сделать?
4 мар 19, 15:14    [21824501]     Ответить | Цитировать Сообщить модератору
 Re: Изменить параметр не меняя исходников чужой библиотеки  [new]
ma1tus
Member

Откуда:
Сообщений: 655
LiYing,

+ что-то вроде, не?
uses
  GR32_Backends_Generic, GR32...

type
  TMyMemoryBackend = class(GR32_Backends_Generic.TMemoryBackend)
  protected
    procedure InitializeSurface(NewWidth, NewHeight: Integer; ClearBuffer: Boolean); override;
  end;

  TMyCustomBitmap32 = class(GR32.TCustomBitmap32)
  public
    class function GetPlatformBackendClass: TCustomBackendClass; virtual;
  end;

  TCustomBitmap32 = class(TMyCustomBitmap32);  

implementation

class function TCustomBitmap32.GetPlatformBackendClass: TCustomBackendClass;
begin
  Result := TMyMemoryBackend;
end;

procedure TMyMemoryBackend.InitializeSurface(NewWidth, NewHeight: Integer; ClearBuffer: Boolean);
begin
  ...
end;
4 мар 19, 15:29    [21824531]     Ответить | Цитировать Сообщить модератору
 Re: Изменить параметр не меняя исходников чужой библиотеки  [new]
LiYing
Member

Откуда:
Сообщений: 495
ma1tus
LiYing,

+ что-то вроде, не?
[src delphi]

Можно и так, но interceptor class (aka interposer class) элегантнее выглядит :)
В принципе все работает. Просто хотелось, чтобы запись TCustomBitmap32.Create() использовала мой модифицированный TMemoryBackend, но используется родной класс. Приходится явно указывать TCustomBitmap32.Create(TMemoryBackend), тогда используется мод.TMemoryBackend.
4 мар 19, 15:37    [21824546]     Ответить | Цитировать Сообщить модератору
 Re: Изменить параметр не меняя исходников чужой библиотеки  [new]
Arioch
Member

Откуда:
Сообщений: 10598
LiYing
interposer class) элегантнее выглядит


O'RLY ?

interposter class работает по одной единственной причине - древний баг в обработке DFM, который боятся или не хотят исправлять.

завязывать свой код на детали реализации (более того, на недостатки реализации) - это элегантно?
4 мар 19, 16:00    [21824579]     Ответить | Цитировать Сообщить модератору
 Re: Изменить параметр не меняя исходников чужой библиотеки  [new]
Arioch
Member

Откуда:
Сообщений: 10598
LiYing
Просто хотелось, чтобы запись TCustomBitmap32.Create() использовала мой модифицированный TMemoryBackend


и обязательно interposter'ом ?

в принципе вполне возможно, надо просто сделать, чтобы TCustomBitmap32.Create грузил себя из DFM, а не создавал всё кодом
4 мар 19, 16:01    [21824581]     Ответить | Цитировать Сообщить модератору
 Re: Изменить параметр не меняя исходников чужой библиотеки  [new]
LiYing
Member

Откуда:
Сообщений: 495
Arioch
надо просто сделать, чтобы TCustomBitmap32.Create грузил себя из DFM, а не создавал всё кодом

Можно развернуть мысль или примерчик как это сделать? ;)
4 мар 19, 16:28    [21824608]     Ответить | Цитировать Сообщить модератору
 Re: Изменить параметр не меняя исходников чужой библиотеки  [new]
Arioch
Member

Откуда:
Сообщений: 10598
ну как, переписываешь этот класс его на манер TComponent, чтобы он использовал TReader, а все свойства у него были Published, ну и DFМ к нему пишешь ручками

скорость будет такая, что даже самые дорогие процессоры колом встанут
4 мар 19, 17:09    [21824652]     Ответить | Цитировать Сообщить модератору
 Re: Изменить параметр не меняя исходников чужой библиотеки  [new]
LiYing
Member

Откуда:
Сообщений: 495
Arioch
скорость будет такая, что даже самые дорогие процессоры колом встанут

Тогда ну его нафиг, измененный юнит в папке проекта - просто и надежно
4 мар 19, 18:21    [21824730]     Ответить | Цитировать Сообщить модератору
 Re: Изменить параметр не меняя исходников чужой библиотеки  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1300
автор
Это класс используется в недрах самой библиотеки. К примеру, в GR32.pas вызывается в


Какое отношение это имеет к классу TMemoryBackend если он в недрах библиотеки работает с TCustomBackend?

Делаете
4 мар 19, 18:41    [21824751]     Ответить | Цитировать Сообщить модератору
 Re: Изменить параметр не меняя исходников чужой библиотеки  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1300
LiYing
Просто хотелось, чтобы запись TCustomBitmap32.Create() использовала мой модифицированный TMemoryBackend, но используется родной класс. Приходится явно указывать TCustomBitmap32.Create(TMemoryBackend), тогда используется мод.TMemoryBackend.

Странная прихоть, для вас собственно и сделали слабую зависимость классов, чтобы через конструктор можно было переопределить реализацию. В чем именно особенность использования конструктора без параметров?
4 мар 19, 18:44    [21824754]     Ответить | Цитировать Сообщить модератору
 Re: Изменить параметр не меняя исходников чужой библиотеки  [new]
Василий 2
Member

Откуда:
Сообщений: 433
Можно пропатчить метод
5 мар 19, 13:26    [21825327]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить