powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Отложенная инициализация
25 сообщений из 25, страница 1 из 1
Отложенная инициализация
    #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
Отложенная инициализация
    #39774269
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petrashkevich,

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

вписать в uses блока Interface модуль, который выполняет инициализацию RegisterProc и не мудрить
...
Рейтинг: 0 / 0
Отложенная инициализация
    #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
Отложенная инициализация
    #39774388
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petrashkevich,

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

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

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

А сделать пакет и в него засунуть компонент - не рассматривается?
...
Рейтинг: 0 / 0
Отложенная инициализация
    #39774574
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetrashkevichwadmanЭто процедура выставляется самой средой. Зачем она в рантайме?
Она нужна чтобы зерегистрировать компонент из текущего модуля. Что бы компонент появился в дизайнере форм проекта.
Не взлетит.
...
Рейтинг: 0 / 0
Отложенная инициализация
    #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
Отложенная инициализация
    #39774796
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нафига вам эта initialization/finalization. Один раз порадовались чудесному автоматическому вызову, а через пять лет ищите "и хто это сделал, да почему именно в этом порядке?".
Инициализируйте явно.
...
Рейтинг: 0 / 0
Отложенная инициализация
    #39774809
Petrashkevich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Система при старте регистрирует некий перечень компонент
Я хочу добавить в систему свой компонент
В момент инициализации моего модуля, процедура регистрации ещё не назначена
Мне нужно отложить регистрацию, до тех пор, когда назначится процедура регистрации.
Но прикрутить модуль в USES я не могу, есть на то причины.
...
Рейтинг: 0 / 0
Отложенная инициализация
    #39774999
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petrashkevich,

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

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

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

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

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

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


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

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

В общем, надо в структуре программы явно зависимости прописывать :-)
...
Рейтинг: 0 / 0
Отложенная инициализация
    #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
Отложенная инициализация
    #39775500
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetrashkevichМне нужно отложить регистрацию, до тех пор, когда назначится процедура регистрации.

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

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

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

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


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