powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Изменить параметр не меняя исходников чужой библиотеки
16 сообщений из 16, страница 1 из 1
Изменить параметр не меняя исходников чужой библиотеки
    #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
Изменить параметр не меняя исходников чужой библиотеки
    #39781976
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
унаследуйся и перекрой метод.
в чем проблема то?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Изменить параметр не меняя исходников чужой библиотеки
    #39781989
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мимопроходящийунаследуйся и перекрой метод.
в чем проблема то?

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

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

В относительно современных версиях Delphi появилась возможность в таких случаях достаточно элегантно выкручиваться через т.н. хелперы.
...
Рейтинг: 0 / 0
Изменить параметр не меняя исходников чужой библиотеки
    #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
Изменить параметр не меняя исходников чужой библиотеки
    #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
Изменить параметр не меняя исходников чужой библиотеки
    #39782057
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ma1tusLiYing,

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

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

O'RLY ?

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

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

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

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

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

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

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


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