powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Освобождение памяти в классах
16 сообщений из 16, страница 1 из 1
Освобождение памяти в классах
    #39763781
Sashaua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите как в таком случае правильно освобождать память/удалять компоненты.
Есь метод класса (обвертка) для работы с базой
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function FBCreateAndOpenQuery(FDB: TFDConnection; FTran: TFDTransaction; SQL: string;
  ParamNames: array of string; ParamValues: array of Variant;
  AOwner: TComponent): TFDQuery;

 Result:=TFDQuery.Create(AOwner);
 Result.Connection:=FDB;
 Result.Transaction:=FTran;
 Result.SQL.Text := SQL;
  if Length(ParamNames) <> Length(ParamValues) then
  raise Exception.Create('Params and values have different size');
......
Далее взякая магия с разбором текста SQL и выполнение запроса


Далее есть методы которые выполняют запросы

Код: pascal
1.
2.
3.
4.
5.
function some_method: TFDQuery;

begin
result:=CreateAndOpenQuery(FDConnection_main,FDTransaction,'SQL_TXT',[],[],nil);
end;



DataSource1.DataSet:=some_method;

Как правильно после того как данные в DataSource1 ненадо удалить все дело с памяти.
за ранее спасибо
...
Рейтинг: 0 / 0
Освобождение памяти в классах
    #39763782
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
переходи на интерфейсы
(Interface types)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Освобождение памяти в классах
    #39763783
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"обвертка" уже не освобождает память когда количество параметров не соответствует

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
function FBCreateAndOpenQuery(FDB: TFDConnection; FTran: TFDTransaction; SQL: string;
  ParamNames: array of string; ParamValues: array of Variant;
  AOwner: TComponent): TFDQuery;
begin
   if Length(ParamNames) <> Length(ParamValues) then
    raise Exception.Create('Params and values have different size');
 Result:=TFDQuery.Create(AOwner);
 Result.Connection:=FDB;
 Result.Transaction:=FTran;
 Result.SQL.Text := SQL;



авторКак правильно после того как данные в DataSource1 ненадо удалить все дело с памяти.

Код: pascal
1.
2.
3.
D := DataSource1.DataSet;
DataSource1.DataSet := nil;
D.Free;
...
Рейтинг: 0 / 0
Освобождение памяти в классах
    #39763812
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr"обвертка" уже не освобождает память когда количество параметров не соответствует

Код: pascal
1.
2.
3.
4.
5.
6.
7.
function FBCreateAndOpenQuery(FDB: TFDConnection; FTran: TFDTransaction; SQL: string;
  ParamNames: array of string; ParamValues: array of Variant;
  AOwner: TComponent): TFDQuery;
begin
   if Length(ParamNames) <> Length(ParamValues) then
    raise Exception.Create('Params and values have different size');
 Result:=TFDQuery.Create(AOwner);


Лучше так, навсякий:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
function FBCreateAndOpenQuery(FDB: TFDConnection; FTran: TFDTransaction; SQL: string;
  ParamNames: array of string; ParamValues: array of Variant;
  AOwner: TComponent): TFDQuery;
begin
  Result:=TFDQuery.Create(AOwner);
  try
    Result.Connection:=FDB;
    //... Всё остальное. Можно даже генерить исключения
  except
    Result.Free;
    raise;
  end;
end;
...
Рейтинг: 0 / 0
Освобождение памяти в классах
    #39763864
Sashaua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr,

А если у меня приблизотельно такой сценарий, на форме?

действия пользователя
обращение к методу - отображение двнных в гриде
опять действия пользователя
обращение к методу - отображение двнных в гриде
если сделать
Код: pascal
1.
2.
3.
D := DataSource1.DataSet;
DataSource1.DataSet := nil;
D.Free;


данных в гриде пользователь и неувидит так как сразу ресурсы освободяться.
...
Рейтинг: 0 / 0
Освобождение памяти в классах
    #39763884
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда, правильно сформулируйте вопрос, а то из этого набора слов ничего не понятно
Как правильно после того как данные в DataSource1 ненадо удалить все дело с памяти.
...
Рейтинг: 0 / 0
Освобождение памяти в классах
    #39763886
Sashaua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr,
На форме есть TreeView со списком накладных, по щелчку на ноде в DBGridEh загружается информация по накладной.
Загрузка накладной это запрос в базу путем обращения к методу
Код: pascal
1.
2.
3.
4.
5.
function some_method: TFDQuery;

begin
result:=CreateAndOpenQuery(FDConnection_main,FDTransaction,'SQL_TXT',[],[],nil);
end;



возвращаеться набор данных TFDQuery который отображаеться в гриде через DataSource1.
Пользователь щелкнул на ноде выполнился запрос данные отобразились, щелкнул на другой выполнился запрос данные отобразились итд
После всех действий как правильно чистить память от того что насоздавалось в CreateAndOpenQuery.
...
Рейтинг: 0 / 0
Освобождение памяти в классах
    #39763887
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashauaПользователь щелкнул на ноде выполнился запрос данные отобразились, щелкнул на другой выполнился запрос данные отобразились
Код: pascal
1.
2.
3.
4.
5.
6.
procedure NodeClick();
begin
  D := DataSource1.DataSet;
  DataSource1.DataSet := some_method;
  D.Free;  
end;
...
Рейтинг: 0 / 0
Освобождение памяти в классах
    #39764466
Sashaua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

>Лучше так, навсякий:
благодарю, учел.
...
Рейтинг: 0 / 0
Освобождение памяти в классах
    #39764585
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrSashauaПользователь щелкнул на ноде выполнился запрос данные отобразились, щелкнул на другой выполнился запрос данные отобразились
Код: pascal
1.
2.
3.
4.
5.
6.
procedure NodeClick();
begin
  D := DataSource1.DataSet;
  DataSource1.DataSet := some_method;
  D.Free;  
end;



Как-то это смущает....
Вот лазит он по дереву и кликает на узлы. И теперь всё рушить и заново датасетить? Может и коннекшн пересоздавать?

imho получил датасет, построил дерево и лазий по нему не закрывая датасет.
И рядом иметь кнопку или в менюшке ОБНОВИТЬ. Вот тут уже и РеОпен датасету.
______________
Типа пока я обедал, в базе покопались.
...
Рейтинг: 0 / 0
Освобождение памяти в классах
    #39764641
Sashaua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GatorDimaBrпропущено...

Код: pascal
1.
2.
3.
4.
5.
6.
procedure NodeClick();
begin
  D := DataSource1.DataSet;
  DataSource1.DataSet := some_method;
  D.Free;  
end;



Как-то это смущает....
Вот лазит он по дереву и кликает на узлы. И теперь всё рушить и заново датасетить? Может и коннекшн пересоздавать?

imho получил датасет, построил дерево и лазий по нему не закрывая датасет.
И рядом иметь кнопку или в менюшке ОБНОВИТЬ. Вот тут уже и РеОпен датасету.
______________
Типа пока я обедал, в базе покопались.

Дерево строится только раз, а вот тогда пользователь щелкает на какие-то узлы дерева в зависимости от узла необходимо показать разные данные в гриде (DBGridEh).
...
Рейтинг: 0 / 0
Освобождение памяти в классах
    #39764658
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно, что я что то упустил, но зачем там вообще "отстройка" D?

DataSource1.DataSet := some_method;
try
<...>
finally
DataSource1.DataSet.Free;
end;
...
Рейтинг: 0 / 0
Освобождение памяти в классах
    #39764885
Sashaua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad FВозможно, что я что то упустил, но зачем там вообще "отстройка" D?

DataSource1.DataSet := some_method;
try
<...>
finally
DataSource1.DataSet.Free;
end;
Если сразу сделать DataSource1.DataSet.Free; данные с грида пропадут.
...
Рейтинг: 0 / 0
Освобождение памяти в классах
    #39764909
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sashaua,

А если не сразу, то DataSource до поры будет показывать из уже освобожденного участка памяти? Круто.))
...
Рейтинг: 0 / 0
Освобождение памяти в классах
    #39764917
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GatorКак-то это смущает....
Вот лазит он по дереву и кликает на узлы. И теперь всё рушить и заново датасетить? Может и коннекшн пересоздавать?
Я открываю датасет по DblClick на узле, и закрываю при NodeChange.
ТС пересоздаёт датасет, ну так ему хочется.
...
Рейтинг: 0 / 0
Освобождение памяти в классах
    #39764923
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sashaua,

1) если вы не хотите пользоваться интерфейсами, то
2) вам нужно самостоятельно определить момент, когда данные не нужны.

А теперь лирика. Момент уничтожения данных в гриде может быть как переход (в вашем случае) к другому узлу в дереве, закрытие формы и др.

можно так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure NodeClick();
begin
  if Assigned(DataSource1.DataSet) then
    DataSource1.DataSet.Free;

  DataSource1.DataSet = some_method
end;

procedure Form1.Close;
begin
  if Assigned(DataSource1.DataSet) then
    DataSource1.DataSet.Free;
end;
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Освобождение памяти в классах
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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