Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Изменить параметр не меняя исходников чужой библиотеки / 16 сообщений из 16, страница 1 из 1
04.03.2019, 14:29
    #39781969
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить параметр не меняя исходников чужой библиотеки
В известной Graphics32 Library есть unit GR32_Backends_Generic с классом:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  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 в папку своего проекта?
...
Рейтинг: 0 / 0
04.03.2019, 14:34
    #39781976
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить параметр не меняя исходников чужой библиотеки
унаследуйся и перекрой метод.
в чем проблема то?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.03.2019, 14:44
    #39781989
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить параметр не меняя исходников чужой библиотеки
Мимопроходящийунаследуйся и перекрой метод.
в чем проблема то?

Но я же не могу написать унаследованный класс как TMemoryBackend = class(TMemoryBackend). Или могу? Имя класса не должно поменяться, вот в чем затык...
...
Рейтинг: 0 / 0
04.03.2019, 14:48
    #39781992
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить параметр не меняя исходников чужой библиотеки
04.03.2019 14:44, LiYing пишет:
> Имя класса не должно поменяться

поцчему?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.03.2019, 14:48
    #39781993
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить параметр не меняя исходников чужой библиотеки
LiYing,

В относительно современных версиях Delphi появилась возможность в таких случаях достаточно элегантно выкручиваться через т.н. хелперы.
...
Рейтинг: 0 / 0
04.03.2019, 15:14
    #39782029
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить параметр не меняя исходников чужой библиотеки
Мимопроходящий04.03.2019 14:44, LiYing пишет:
> Имя класса не должно поменяться

поцчему?

Это класс используется в недрах самой библиотеки. К примеру, в GR32.pas вызывается в
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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;


Написал свой перехватчик класса:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
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, а не мой модфицированный.
Ничего нельзя сделать?
...
Рейтинг: 0 / 0
04.03.2019, 15:29
    #39782048
ma1tus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить параметр не меняя исходников чужой библиотеки
LiYing,

что-то вроде, не?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
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;

...
Рейтинг: 0 / 0
04.03.2019, 15:37
    #39782057
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить параметр не меняя исходников чужой библиотеки
ma1tusLiYing,

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

Можно и так, но interceptor class (aka interposer class) элегантнее выглядит :)
В принципе все работает. Просто хотелось, чтобы запись TCustomBitmap32.Create() использовала мой модифицированный TMemoryBackend, но используется родной класс. Приходится явно указывать TCustomBitmap32.Create(TMemoryBackend), тогда используется мод.TMemoryBackend.
...
Рейтинг: 0 / 0
04.03.2019, 16:00
    #39782076
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить параметр не меняя исходников чужой библиотеки
LiYinginterposer class) элегантнее выглядит

O'RLY ?

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

завязывать свой код на детали реализации (более того, на недостатки реализации) - это элегантно?
...
Рейтинг: 0 / 0
04.03.2019, 16:01
    #39782077
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить параметр не меняя исходников чужой библиотеки
LiYingПросто хотелось, чтобы запись TCustomBitmap32.Create() использовала мой модифицированный TMemoryBackend

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

в принципе вполне возможно, надо просто сделать, чтобы TCustomBitmap32.Create грузил себя из DFM, а не создавал всё кодом
...
Рейтинг: 0 / 0
04.03.2019, 16:28
    #39782100
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить параметр не меняя исходников чужой библиотеки
Ariochнадо просто сделать, чтобы TCustomBitmap32.Create грузил себя из DFM, а не создавал всё кодом
Можно развернуть мысль или примерчик как это сделать? ;)
...
Рейтинг: 0 / 0
04.03.2019, 17:09
    #39782132
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить параметр не меняя исходников чужой библиотеки
ну как, переписываешь этот класс его на манер TComponent, чтобы он использовал TReader, а все свойства у него были Published, ну и DFМ к нему пишешь ручками

скорость будет такая, что даже самые дорогие процессоры колом встанут
...
Рейтинг: 0 / 0
04.03.2019, 18:21
    #39782186
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить параметр не меняя исходников чужой библиотеки
Ariochскорость будет такая, что даже самые дорогие процессоры колом встанут
Тогда ну его нафиг, измененный юнит в папке проекта - просто и надежно
...
Рейтинг: 0 / 0
04.03.2019, 18:41
    #39782197
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить параметр не меняя исходников чужой библиотеки
авторЭто класс используется в недрах самой библиотеки. К примеру, в GR32.pas вызывается в

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

Делаете
...
Рейтинг: 0 / 0
04.03.2019, 18:44
    #39782200
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить параметр не меняя исходников чужой библиотеки
LiYing Просто хотелось, чтобы запись TCustomBitmap32.Create() использовала мой модифицированный TMemoryBackend, но используется родной класс. Приходится явно указывать TCustomBitmap32.Create(TMemoryBackend), тогда используется мод.TMemoryBackend.
Странная прихоть, для вас собственно и сделали слабую зависимость классов, чтобы через конструктор можно было переопределить реализацию. В чем именно особенность использования конструктора без параметров?
...
Рейтинг: 0 / 0
05.03.2019, 13:26
    #39782474
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить параметр не меняя исходников чужой библиотеки
Можно пропатчить метод
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Изменить параметр не меняя исходников чужой библиотеки / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]