Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Отложенная инициализация / 25 сообщений из 25, страница 1 из 1
15.02.2019, 09:15
    #39774226
Petrashkevich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отложенная инициализация
Здравствуйте !!!
В одном из модулей проекта нужно произвести регистрацию процедуры.
Код: pascal
1.
RegisterProc('MyModule',[TMyComponent]);


Сама регистрация выглядит так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure RegisterProc(const Page: string;  ComponentClasses: array of TComponentClass);
begin
  if Assigned(RegisterComponentsProc) then
    RegisterComponentsProc(Page, ComponentClasses)
  else
    raise EComponentError.CreateRes(@SRegisterError);
end;



Запихнул RegisterProc в инициализацию модуля, но в момент инициализации RegisterComponentsProc = nil и валится ошибка
Код: pascal
1.
2.
initialization
  RegisterProc('MyModule',[TMyComponent]); // ошибка потому что RegisterComponentsProc=nil



Как отложить инициализацию СВОЕГО модуля в конец списка ?
...
Рейтинг: 0 / 0
15.02.2019, 10:36
    #39774269
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отложенная инициализация
Petrashkevich,

расположение (выше/ниже) модулей в dpr влияет на последовательность вызовов initialisaion. Смотри, может поможет.
...
Рейтинг: 0 / 0
15.02.2019, 10:45
    #39774278
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отложенная инициализация
Petrashkevich,

вписать в uses блока Interface модуль, который выполняет инициализацию RegisterProc и не мудрить
...
Рейтинг: 0 / 0
15.02.2019, 12:33
    #39774387
Petrashkevich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отложенная инициализация
А так можно сделать ?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
TInitComp = class(TTimer)
  procedure DoTimer(Sender: TObject);
end;

procedure TInitComp.DoTimer(Sender: TObject);
begin
   if Assigned(RegisterComponentsProc) then begin
    RegisterProc('MyModule',[TMyComponent]);
    Enabled := false;
  end;
end;


initialization
  with TInitComp.Create(Application) do begin
    OnTimer : = DoTimer;
    Enabled := true;
  end;
...
Рейтинг: 0 / 0
15.02.2019, 12:35
    #39774388
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отложенная инициализация
Petrashkevich,

всё можно, если карму не жалко
...
Рейтинг: 0 / 0
15.02.2019, 12:50
    #39774403
Petrashkevich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отложенная инициализация
kealon(Ruslan)всё можно, если карму не жалко
А что это значит ?
...
Рейтинг: 0 / 0
15.02.2019, 13:11
    #39774427
энди
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отложенная инициализация
Я как-то видел человека которому надо было сохранить массив строк в программе, так вот он чтобы это сделать положил на форму невидимый TMemo и в него строки засунул. Вот это как бы примерно из той же серии :)
...
Рейтинг: 0 / 0
15.02.2019, 14:03
    #39774478
Petrashkevich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отложенная инициализация
Проблема в том, что текущий модуль используется в разных проектах.
В разных проектах метод регистрации свой, и соответственно USES не получается прикрутить.
...
Рейтинг: 0 / 0
15.02.2019, 14:15
    #39774489
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отложенная инициализация
Таймер требует гуя. Более универсальное решение - поток.
Но более корректно отследить, как и когда присваивается RegisterComponentsProc. Я нашел только в Classes, и то там только такая же проверка, как в RegisterProc
...
Рейтинг: 0 / 0
15.02.2019, 14:16
    #39774491
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отложенная инициализация
Petrashkevich,

ну если уж плохого не избежать сделай как в RTL

заведи интерфейсный модуль и в нём сделай процедуру регистрации, в которой просто сохраняй в список
и уже его вызывай для инициализации заполненной коллекции
...
Рейтинг: 0 / 0
15.02.2019, 15:03
    #39774548
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отложенная инициализация
PetrashkevichВ одном из модулей проекта нужно произвести регистрацию процедуры.
Это процедура выставляется самой средой. Зачем она в рантайме?
...
Рейтинг: 0 / 0
15.02.2019, 15:09
    #39774556
Petrashkevich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отложенная инициализация
wadmanЭто процедура выставляется самой средой. Зачем она в рантайме?
Она нужна чтобы зерегистрировать компонент из текущего модуля. Что бы компонент появился в дизайнере форм проекта.
...
Рейтинг: 0 / 0
15.02.2019, 15:18
    #39774573
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отложенная инициализация
PetrashkevichwadmanЭто процедура выставляется самой средой. Зачем она в рантайме?
Она нужна чтобы зерегистрировать компонент из текущего модуля. Что бы компонент появился в дизайнере форм проекта.

А сделать пакет и в него засунуть компонент - не рассматривается?
...
Рейтинг: 0 / 0
15.02.2019, 15:19
    #39774574
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отложенная инициализация
PetrashkevichwadmanЭто процедура выставляется самой средой. Зачем она в рантайме?
Она нужна чтобы зерегистрировать компонент из текущего модуля. Что бы компонент появился в дизайнере форм проекта.
Не взлетит.
...
Рейтинг: 0 / 0
15.02.2019, 22:00
    #39774781
Petrashkevich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отложенная инициализация
DarkMasterА сделать пакет и в него засунуть компонент - не рассматривается?
Проект не загружает список пакетов, регистрация проходит вручную. Внедрить регистрацию своего модуля (и компонента) пока что нельзя

Код: 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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
procedure DoRegister;
begin
{$IFDEF Reg_Standard}
  ooDesignEditors.Register;
{$ENDIF}

{$IFDEF Reg_ADO}
  adoreg.Register;
{$ENDIF}

{$IFDEF Reg_cxEdits}
  cxEditReg.Register;
  cxExtEditReg.Register;
  cxLibraryReg.Register;
  cxPCReg.Register;
{$ENDIF}

{$IFDEF Reg_cxGrids}
  cxGridReg.Register;
  cxGridPopupMenuReg.Register;
  cxClassesReg.Register;
{$ENDIF}

{$IFDEF Reg_cxTree}
  cxTLReg.Register;
{$ENDIF}

{$IFDEF Reg_ooComponents}
 Reg_ooComponents.Register;
 Reg_ooComponentsStyle.Register;
 Reg_ooComponentsReference.Register;
 ooDBUtils.Register;
{$ENDIF}
 RegisterActions('Dataset', [TDataSetFirst, TDataSetPrior, TDataSetNext,
    TDataSetLast, TDataSetInsert, TDataSetDelete, TDataSetEdit, TDataSetPost,
    TDataSetCancel, TDataSetRefresh], TStandardDatasetActions);
end;

initialization
  DoRegister;
end.

...
Рейтинг: 0 / 0
15.02.2019, 23:56
    #39774796
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отложенная инициализация
Нафига вам эта initialization/finalization. Один раз порадовались чудесному автоматическому вызову, а через пять лет ищите "и хто это сделал, да почему именно в этом порядке?".
Инициализируйте явно.
...
Рейтинг: 0 / 0
16.02.2019, 02:38
    #39774809
Petrashkevich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отложенная инициализация
Система при старте регистрирует некий перечень компонент
Я хочу добавить в систему свой компонент
В момент инициализации моего модуля, процедура регистрации ещё не назначена
Мне нужно отложить регистрацию, до тех пор, когда назначится процедура регистрации.
Но прикрутить модуль в USES я не могу, есть на то причины.
...
Рейтинг: 0 / 0
16.02.2019, 21:03
    #39774999
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отложенная инициализация
Petrashkevich,

А прикрутить в uses тот модуль, который назначит процедуру инициализации?
...
Рейтинг: 0 / 0
16.02.2019, 21:07
    #39775000
Petrashkevich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отложенная инициализация
Cobalt747Petrashkevich,

А прикрутить в uses тот модуль, который назначит процедуру инициализации?

Отложенная инициализация
...
Рейтинг: 0 / 0
17.02.2019, 10:21
    #39775075
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отложенная инициализация
Petrashkevich,

тогда добавляй директивы условной компиляции
...
Рейтинг: 0 / 0
17.02.2019, 11:34
    #39775080
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отложенная инициализация
Petrashkevich,

Перекрыть System.InitProc?
...
Рейтинг: 0 / 0
18.02.2019, 07:41
    #39775299
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отложенная инициализация
PetrashkevichМне нужно отложить регистрацию, до тех пор, когда назначится процедура регистрации.
Модуль включен в bpl? Нет? Кто тогда назначит эту процедуру, если не ide?
...
Рейтинг: 0 / 0
18.02.2019, 12:36
    #39775478
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отложенная инициализация
энди,

в RxLib/JediVCL есть компонент TxxStrHolder - для хранений строк. И даже что-то типа TxxDFMData для хранения произвольных файлов.


Василий 2Таймер требует гуя.

Кроме того, таймер - всего лишь таймер, он не даёт гарантии, что не выполнится слишком рано, если запуск программы упадёт на что-то тяжёлое, типа общего запуска системы или обострения с обновлением у Касперского.

В общем, надо в структуре программы явно зависимости прописывать :-)
...
Рейтинг: 0 / 0
18.02.2019, 12:47
    #39775488
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отложенная инициализация
У тебя семантика процедуры RegisterProc какая?
Можно ли её вызов просто игнорировать, выкинуть на помойку или нет?
Если нет - то кто-то где-то должен регистрировать ВСЕ её вызовы.

Вариант 1

Petrashkevich
Код: pascal
1.
2.
3.
4.
5.
6.
procedure RegisterProc(const Page: string;  ComponentClasses: array of TComponentClass);
begin
  if not Assigned(RegisterComponentsProc) then
     CreateRegisterComponentsProc;
  RegisterComponentsProc(Page, ComponentClasses);
end;



Вариант 2

Petrashkevich
Код: 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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
procedure RegisterProc(const Page: string;  ComponentClasses: array of TComponentClass);
begin
  if Assigned(RegisterComponentsProc) then
    RegisterComponentsProc(Page, ComponentClasses)
  else
    LogPrematureRegistrations( Page, ComponentClasses );
end;

var RegsLog: TList<TPair<string, TArray<TComponentClass> > >;

procedure LogPrematureRegistrations(const Page: string;  ComponentClasses: array of TComponentClass);
var L: TPair<string, TArray<TComponentClass> >; i: integer;
begin
   if nil = RegsLog then
      RegsLog := TList<TPair<string, TArray<TComponentClass> > >.Create;

   L.Key := Page; 
   SetLength(L.Value, Length(ComponentClasses));
   for i := 0 to Prior(Length(ComponentClasses)) do
       L.Value[i] := ComponentClasses[i];
   
   RegsLog.Add(L);
end;

procedure RegisterRegisterComponentsProc( const handler: ...);
var L: TPair<string, TArray<TComponentClass> >;
begin
   if not Assigned(handler) then raise ....;
   if Assigned ( RegisterComponentsProc ) then raise ...; // запрещаем подмену обработчика другим, если надо

   RegisterComponentsProc := handler;

   if nil <> RegsLog then begin
      for L in RegsLog do
         handler(L.Key, L.Value);
      FreeAndNil( RegsLog );
   end;
end;
...
Рейтинг: 0 / 0
18.02.2019, 12:56
    #39775500
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отложенная инициализация
PetrashkevichМне нужно отложить регистрацию, до тех пор, когда назначится процедура регистрации.

Другими словами у тебя есть ДВЕ процедуры регистрации, для регистрации в разных местах.
Промежуточном и локончательном.

Значит СРАЗУ назначай ПЕРВУЮ процедуру регистрации, которая будет до поры до времени регистрировать в другом месте.

А при назначении ВТОРОЙ процедуры регистрации - перекачивай в неё данные из первой.

Кстати, в DevExpres 6 весь код из initialization/finalization перевели в два специальных TList
Думаю, это для программ, состоящих из смеси BPL+DLL
С одной стороны - тупой надоедливый boilerplate
С другой - жесткий контроль когда и в каких условиях наконец их вызывать.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Отложенная инициализация / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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