powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Интерфейсы и самоуничтожение
5 сообщений из 5, страница 1 из 1
Интерфейсы и самоуничтожение
    #39924119
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это касается приложения типа UniGUI. Сам автор советует использовать интерфейсы.
Задача. Создать глобальные списки, использовать их в разных местах программы и не заботиться об их уничтожении.
Сразу напишу, что уничтожение объектов в UniMainModule.Destroy делать нельзя, т.к. при перезагрузке страницы может произойти так, что сразу за событием OnCreate выполнится из предыдущей веб-сессии событие OnDestroy.

Основное назначение зачем я это делаю - это, чтобы по 100500 раз их (списки) не наполнять, т.к. это списки, которые часто используются в событиях прорисовки таблиц.

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

Так вот. В классе есть два объекта (два списка TObjectDictionary). Проблема в том, что интерфейсы не могут иметь поля (переменные VAR), т.е. в интерфейс нельзя вставить TObjectDictionary в виде объекта а-ля VAR или свойства, поэтому пришлось объявить TObjectDictionary как результат функции. Не знаю, правильно ли это, т.е. две функции возвращают эти самые два объекта-списка типа TObjectDictionary. Списки один раз наполняются и используются глобально в разных формах приложения. В конце концов списки должны самоуничтожиться. В конструкторе класса вызываю методы создания и наполнения списков. В деструкторе соответственно уничтожение списков.

Ставил бряку внутри Destroy - бряка не срабатывает :( т.е. списки (TObjectDictionary) вместе со своими внутренними объектами не уничтожаются.

Так получилось, что интерфейсы до этого момента не приходилось использовать.

Вот весь модуль интерфейса и класса:

Код: 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.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
unit uKvxListsStyles;

interface

uses
  System.Generics.Collections, uniGUITypes;

type

  IKvxListsStyles = interface
    ['{5884A1CA-1DB7-49EB-B479-088EF15FB621}']

    function StylesTypesList: TObjectDictionary<Integer, TUniCellAttribs>;
    function StylesRegionsList: TObjectDictionary<Integer, TUniCellAttribs>;

    procedure FillTypesStyles;
    procedure FillRegionsStyles;
  end;



  TKvxListsStyles = class(TInterfacedObject, IKvxListsStyles)
  private
     TypesList: TObjectDictionary<Integer, TUniCellAttribs>;
     RegionsList: TObjectDictionary<Integer, TUniCellAttribs>;

    procedure FillTypesStyles;
    procedure FillRegionsStyles;

  public
     function StylesTypesList: TObjectDictionary<Integer, TUniCellAttribs>;
     function StylesRegionsList: TObjectDictionary<Integer, TUniCellAttribs>;
     constructor create;
     destructor Destroy;
  end;

//var
//  KvxListsStyles: IKvxListsStyles;

implementation

uses MainModule;

{ KvxListsStyles }

constructor TKvxListsStyles.create;
begin
  FillTypesStyles;
  FillRegionsStyles;
end;


destructor TKvxListsStyles.Destroy;
begin
  if Assigned(TypesList) then
  begin
    TypesList.Clear;
    TypesList.Free;
  end;

  if Assigned(RegionsList) then
  begin
    RegionsList.Clear;
    RegionsList.Free;
  end;
end;

procedure TKvxListsStyles.FillRegionsStyles;
Var
  Attribs: TUniCellAttribs;
begin
  if Not Assigned(RegionsList) then
    RegionsList := TObjectDictionary<Integer, TUniCellAttribs>.Create([doOwnsValues])
  else
    RegionsList.Clear;
// потом в цикле наполняю список

  RegionsList.Add(0, TUniCellAttribs.Create(True));
  RegionsList.Items[0].Font.Color := -1;

  UniMainModule.qRegionsGetSTATEINDEX.open;
  if UniMainModule.qRegionsGetSTATEINDEX.RecordCount <= 0 then exit;
  while not UniMainModule.qRegionsGetSTATEINDEX.Eof do
  begin
    Attribs := TUniCellAttribs.Create(True);
    Attribs.Font.Color := UniMainModule.qRegionsGetSTATEINDEXSTATEINDEX.Value;

    RegionsList.Add(UniMainModule.qRegionsGetSTATEINDEXID.Value, Attribs);
    UniMainModule.qRegionsGetSTATEINDEX.Next;
  end;// while

  UniMainModule.qRegionsGetSTATEINDEX.close;
end;

procedure TKvxListsStyles.FillTypesStyles;
Var
  Attribs: TUniCellAttribs;
begin
  if Not Assigned(TypesList) then
    TypesList := TObjectDictionary<Integer, TUniCellAttribs>.Create([doOwnsValues])
  else
    TypesList.Clear;

  TypesList.Add(0, TUniCellAttribs.Create(True));
  TypesList.Items[0].Font.Color := -1;

  UniMainModule.qTypesGetSTATEINDEX.open;
  if UniMainModule.qTypesGetSTATEINDEX.RecordCount <= 0 then exit;
  while not UniMainModule.qTypesGetSTATEINDEX.Eof do
  begin
    Attribs := TUniCellAttribs.Create(True);
    Attribs.Font.Color := UniMainModule.qTypesGetSTATEINDEXSTATEINDEX.Value;

    TypesList.Add(UniMainModule.qTypesGetSTATEINDEXID.Value, Attribs);
    UniMainModule.qTypesGetSTATEINDEX.Next;
  end;// while

  UniMainModule.qTypesGetSTATEINDEX.close;

end;

function TKvxListsStyles.StylesRegionsList: TObjectDictionary<Integer, TUniCellAttribs>;
begin
  result := RegionsList;
end;

function TKvxListsStyles.StylesTypesList: TObjectDictionary<Integer, TUniCellAttribs>;
begin
  result := TypesList;
end;

end.





вот так использую, это просто для тестирования при старте главного модуля приложения создаю KvxListsStyles

Код: pascal
1.
2.
3.
4.
5.
6.
procedure TUniMainModule.XXXXXXX;
var
  KvxListsStyles: IKvxListsStyles;
begin
    KvxListsStyles := TKvxListsStyles.Create;
end;




Модет быть неправильно то, что сделал TObjectDictionary в виде результата функции? Может надо объявить их как отдельные глобальные переменные?

Спасибо.
...
Рейтинг: 0 / 0
Интерфейсы и самоуничтожение
    #39924123
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Destroy таки должен быть override.
...
Рейтинг: 0 / 0
Интерфейсы и самоуничтожение
    #39924143
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О! Спасибо!
...
Рейтинг: 0 / 0
Интерфейсы и самоуничтожение
    #39924699
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
в интерфейс нельзя вставить TObjectDictionary в виде объекта а-ля VAR или свойства
Свойства объявлять можно. Но геттер и сеттер такого свойства должны быть методы этого интерфейса

X11
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  IKvxListsStyles = interface
    ['{5884A1CA-1DB7-49EB-B479-088EF15FB621}']

    function StylesTypesList: TObjectDictionary<Integer, TUniCellAttribs>;
    function StylesRegionsList: TObjectDictionary<Integer, TUniCellAttribs>;

    procedure FillTypesStyles;
    procedure FillRegionsStyles;
  end;

выделенных методов в интерфейсе быть не должно. Это приватные методы класса

Вместо этой простыни
X11
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
destructor TKvxListsStyles.Destroy;
begin
  if Assigned(TypesList) then
  begin
    TypesList.Clear;
    TypesList.Free;
  end;

  if Assigned(RegionsList) then
  begin
    RegionsList.Clear;
    RegionsList.Free;
  end;
end;

достаточно написать
Код: pascal
1.
2.
3.
4.
5.
6.
destructor TKvxListsStyles.Destroy;
begin
  TypesList.Free;
  RegionsList.Free;
  inherited Destroy;  // не забываем о родителях
end;

код будет абсолютно равнозначный.

Ну и еще, чтобы избежать неявной модификации списков, я бы делал так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  IKvxList = interface
    ['{A3333E27-6DBA-4792-B2B6-27CF6170DB0F}']
    function GetItem(AIdx: Integer): TUniCellAttribs;
  end;

  IKvxListsStyles = interface
    ['{5884A1CA-1DB7-49EB-B479-088EF15FB621}']
    function StylesTypesList: IKvxList;
    function StylesRegionsList: IKvxList;
  end;
...
Рейтинг: 0 / 0
Интерфейсы и самоуничтожение
    #39924705
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

спасибо
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Интерфейсы и самоуничтожение
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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