Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Расположение объектов в памяти и ссылки на них / 16 сообщений из 16, страница 1 из 1
29.07.2020, 01:15
    #39984792
Galadriel75
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расположение объектов в памяти и ссылки на них
Ciao a tutti.
Мне вот интересно, почему образуется битая ссылка на объект в программе на Delphi. Что происходит с контролами в памяти в ран-тайме?
Сейчас не могу показать код, попробую на словах рассказать.
1. Обычная форма VCL, которая создается на старте приложения. На форме есть pagecontrol с двумя страницами. На каждой странице есть один грид и одна панель. На форме также валяются два adoquery.

2. Создаю класс-наследник TForm.
3. В этом классе помимо всего есть и поле типа TAdoQuery. Ну, и кнопка кроме всего прочего...
4. Создаю два объекта класса этой формы и через сеттер инициализирую поле tAdoQuery - поле смотрит на то место в памяти, где лежит adoquery с главной формы.
Оба объекта натягиваю на панели в первой форме. Ну, надо мне так... Все корректно инициализируется - проверил.
По кнопке надо обратиться к тем самыи квери, которые передал по ссылке из главной формы. Но в памяти все переигралось. Ссылки на квери из динамической формы почему-то стали не актуальны. Квери на главной форме в памяти куда-то переехали и я уже до них не могу добраться из динамически созданных форм. Разве инициализированные объекты в памяти не висят по одним и тем же адресам?
Заранее спасибо!
...
Рейтинг: 0 / 0
29.07.2020, 02:11
    #39984795
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расположение объектов в памяти и ссылки на них
Galadriel75
Оба объекта натягиваю на панели в первой форме. Ну, надо мне так... Все корректно инициализируется - проверил.

Плохо проверил. Наличие битых ссылок - вина программиста
...
Рейтинг: 0 / 0
29.07.2020, 10:08
    #39984840
Galadriel75
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расположение объектов в памяти и ссылки на них
DimaBr
Galadriel75
Оба объекта натягиваю на панели в первой форме. Ну, надо мне так... Все корректно инициализируется - проверил.

Плохо проверил. Наличие битых ссылок - вина программиста


Полагаю, саму эмбаркадеру тоже делали программисты? Стало быть, это их вина? А я все отлично проверил, 5 строчнек кода, там и проверять нечего.

Если есть что по существу, тогда хорошо, а в ином случае - неинтересно...
...
Рейтинг: 0 / 0
29.07.2020, 10:28
    #39984849
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расположение объектов в памяти и ссылки на них
Galadriel75,

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

Выкладывайте свой код.
...
Рейтинг: 0 / 0
29.07.2020, 10:44
    #39984853
Galadriel75
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расположение объектов в памяти и ссылки на них
в конструкторе главной формы:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
constructor TfrmCalculationMechanism.Create(aOwner: TComponent);
begin
  inherited;
  frmEnterDataAccrual := TFrmEnterData.Create(nil);
  frmEnterDataAccrual.getDatamodule.setSign(1);
  frmEnterDataDeduct :=  TFrmEnterData.Create(nil);
  frmEnterDataDeduct.getDatamodule.setSign(-1);
end;


frmEnterDataAccrual и frmEnterDataDeduct - созданы!

В момент onShow главной формы инициализация полей форм, которые только что создали:
Код: 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.
if assigned(frmEnterDataAccrual) then
  begin
    frmEnterDataAccrual.BorderStyle := bsNone;
    frmEnterDataAccrual.parent := panelExpressionAccrual;
    frmEnterDataAccrual.Align := alClient;
    frmEnterDataAccrual.init(DM.DB);
    frmEnterDataAccrual.setId(qryAccrual.fieldByName('id').asInteger);
    frmEnterDataAccrual.ReopenParameters();
    frmEnterDataAccrual.getDatamodule.setUserId(-1);
    [color=red]frmEnterDataAccrual.setQueryParam(self.qryAccrual);[/color]
    log(4, '+++++++++++++++++++++++++++');
    paramLog(self.qryAccrual);
    frmEnterDataAccrual.setGridView(TcxGridDBTableView(TcxGridSite(cxGridAccrual).GridView));
    showMessage(frmEnterDataAccrual.getQueryParamSQL);
    frmEnterDataAccrual.Show;
  end;

  if assigned(frmEnterDataDeduct) then
  begin
    frmEnterDataDeduct.BorderStyle := bsNone;
    frmEnterDataDeduct.parent := panelExpressionDeduct;
    frmEnterDataDeduct.Align := alClient;
    frmEnterDataDeduct.init(DM.DB);
    frmEnterDataDeduct.setId(qryDeduct.fieldByName('id').asInteger);
    frmEnterDataDeduct.ReopenParameters();
    frmEnterDataDeduct.getDatamodule.setUserId(-1);
    [color=red]frmEnterDataAccrual.setQueryParam(self.qryDeduct);[/color]
    frmEnterDataAccrual.setGridView(TcxGridDBTableView(TcxGridSite(cxGridDeduct).GridView));
    showMessage(frmEnterDataAccrual.getQueryParamSQL);
    frmEnterDataDeduct.Show;
...
Рейтинг: 0 / 0
29.07.2020, 11:04
    #39984856
Galadriel75
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расположение объектов в памяти и ссылки на них
frmEnterDataAccrual.setQueryParam(self.qryAccrual)
frmEnterDataAccrual.setQueryParam(self.qryDeduct) - инициализированы верно - сразу после инициализации я дернул у них SQL.text - каждый показал свой sql - объекты в памяти живут.
Когда нажимаю на кнопку:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
try
    fDataModule.qryFast.Close;
    fDataModule.qryFast.SQl.Text := format('exec param_update %d, ''%s'', ''%s'', %d',
                                    [fDataModule.getId
                                     , trim(syntaxMemo_Name.Text)
                                     , trim(syntaxMemo_param_expression.Text)
                                     , fDatamodule.getUserId]);
    paramlog(fDataModule.qryFast);
    fDataModule.qryFast.ExecSQL;
    fQueryParam.close;
    fQueryParam.Open;
    log(4, 'Save Save Save');
    paramLog(fQueryParam);
  //  fGridView.LayoutChanged;
    showMessage(fQueryParam.SQL.Text);
  except
    on e:Exception do
    showMessage(fQueryParam.SQL.Text + ' ' + e.message);
  end;



fQueryParam.close;
fQueryParam.Open; уже не могут отработать - они не видят тот объект, который видели в момент инициализации!
те самые две ADOQuery, ссылки на которые я передал в динамически созданную форму как бы есть, но уже где-то в другом месте в памяти.
Может так и не стоит делать, может лучше передать ссылку на всю форму, на котороую динамические формы натягиваю...
Вариантов много, как можно соорудить, но хотелось бы понять, почему в этом случае теряются объекты по ссылкам...
...
Рейтинг: 0 / 0
29.07.2020, 11:19
    #39984863
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расположение объектов в памяти и ссылки на них
Что такое fQueryParam и как он связан со всем предыдущим текстом ?
...
Рейтинг: 0 / 0
29.07.2020, 11:27
    #39984867
Galadriel75
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расположение объектов в памяти и ссылки на них
DimaBr
Что такое fQueryParam и как он связан со всем предыдущим текстом ?


Код: pascal
1.
2.
3.
4.
5.
6.
private
    fQuery: TADOQuery;
    fDataModule : TDM_EnterData;
    fConnection : TADOConnection;
    fQueryParam : TADOQuery;
    fGridView : TcxGridDBTableView;



fQueryParam : TADOQuery;

Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TfrmEnterData.setQueryParam(const aQueryParam: TADOQuery);
begin
  fQueryParam := aQueryParam;
  showMessage(fQueryParam.sql.text);
  log(4, '---------------------');
  paramLog(fQueryParam);
end;




fQueryParam : TADOQuery; - смотрит на тот квери, который валяется на главной форме. Проект не мой изначально. Квери я не храню на формах... Переделывать уже нет времени
...
Рейтинг: 0 / 0
29.07.2020, 11:28
    #39984868
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расположение объектов в памяти и ссылки на них
Чтобы найти по коду, где вы затираете frmEnterDataAccrual, уберите его из свойств формы и объявите такую же функцию
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
TMyForm=class()
  public
    New_frmEnterDataAccrual: TFrmEnterData;
    function frmEnterDataAccrual: TFrmEnterData;
end; 

function frmEnterDataAccrual: TFrmEnterData;
begin
  Result := New_frmEnterDataAccrual;
end;


Тогда СОЗДАТЬ ФОРМУ (присвоить новое значение на ссылку) из каких либо других мест уже не получится
...
Рейтинг: 0 / 0
29.07.2020, 11:34
    #39984871
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расположение объектов в памяти и ссылки на них
Код: 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.
if assigned(frmEnterDataAccrual) then
  begin
    frmEnterDataAccrual.BorderStyle := bsNone;
    frmEnterDataAccrual.parent := panelExpressionAccrual;
    frmEnterDataAccrual.Align := alClient;
    frmEnterDataAccrual.init(DM.DB);
    frmEnterDataAccrual.setId(qryAccrual.fieldByName('id').asInteger);
    frmEnterDataAccrual.ReopenParameters();
    frmEnterDataAccrual.getDatamodule.setUserId(-1);
    frmEnterDataAccrual.setQueryParam(self.qryAccrual); // тут fQueryParam получает значение self.qryAccrual
    log(4, '+++++++++++++++++++++++++++');
    paramLog(self.qryAccrual);
    frmEnterDataAccrual.setGridView(TcxGridDBTableView(TcxGridSite(cxGridAccrual).GridView));
    showMessage(frmEnterDataAccrual.getQueryParamSQL);
    frmEnterDataAccrual.Show;
  end;

  if assigned(frmEnterDataDeduct) then
  begin
    frmEnterDataDeduct.BorderStyle := bsNone;
    frmEnterDataDeduct.parent := panelExpressionDeduct;
    frmEnterDataDeduct.Align := alClient;
    frmEnterDataDeduct.init(DM.DB);
    frmEnterDataDeduct.setId(qryDeduct.fieldByName('id').asInteger);
    frmEnterDataDeduct.ReopenParameters();
    frmEnterDataDeduct.getDatamodule.setUserId(-1);
    frmEnterDataAccrual.setQueryParam(self.qryDeduct);  // тут fQueryParam получает значение self.qryDeduct а про self.qryAccrual забывает
    frmEnterDataAccrual.setGridView(TcxGridDBTableView(TcxGridSite(cxGridDeduct).GridView));
    showMessage(frmEnterDataAccrual.getQueryParamSQL);
    frmEnterDataDeduct.Show;
...
Рейтинг: 0 / 0
29.07.2020, 11:46
    #39984879
Galadriel75
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расположение объектов в памяти и ссылки на них
// тут fQueryParam получает значение self.qryDeduct а про self.qryAccrual забывает - он не забывает - создаются же ДВА РАЗНЫХ обехкта одного класса - память выделяется для КАЖДОГО отдельно.
...
Рейтинг: 0 / 0
29.07.2020, 11:47
    #39984881
Galadriel75
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расположение объектов в памяти и ссылки на них
и еще вопрос - а как на форуме код выделять? - чето [COLOR] не прокатывает у меня...
...
Рейтинг: 0 / 0
29.07.2020, 11:51
    #39984887
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расположение объектов в памяти и ссылки на них
Galadriel75
и еще вопрос - а как на форуме код выделять? - чето [COLOR] не прокатывает у меня...

В редакторе есть ссылка "Помощь".

Код: pascal
1.
2.
3.
begin
  s := 'test';
end;
...
Рейтинг: 0 / 0
29.07.2020, 11:58
    #39984890
Galadriel75
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расположение объектов в памяти и ссылки на них
wadman
Galadriel75
и еще вопрос - а как на форуме код выделять? - чето [COLOR] не прокатывает у меня...

В редакторе есть ссылка "Помощь".

Код: pascal
1.
2.
3.
begin
  s := 'test';
end;


ок пасиб гляну
...
Рейтинг: 0 / 0
29.07.2020, 12:21
    #39984896
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расположение объектов в памяти и ссылки на них
Galadriel75
и еще вопрос - а как на форуме код выделять? - чето [COLOR] не прокатывает у меня...

Нажмите на Цитировать и увидите, как это сделано
...
Рейтинг: 0 / 0
29.07.2020, 12:43
    #39984904
Galadriel75
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расположение объектов в памяти и ссылки на них
Код: pascal
1.
2.
    frmEnterDataAccrual.setQueryParam(self.qryDeduct);  // тут fQueryParam получает значение self.qryDeduct а про self.qryAccrual забывает
    frmEnterDataAccrual.setGridView(TcxGridDBTableView(TcxGridSite(cxGridDeduct).GridView));




ой! Точно! Спасибо!!! Тока щас увидел! Вот же!!!! Атас!

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


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