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

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

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

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


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

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

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

Выкладывайте свой код.
...
Рейтинг: 0 / 0
Расположение объектов в памяти и ссылки на них
    #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
Расположение объектов в памяти и ссылки на них
    #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
Расположение объектов в памяти и ссылки на них
    #39984863
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что такое fQueryParam и как он связан со всем предыдущим текстом ?
...
Рейтинг: 0 / 0
Расположение объектов в памяти и ссылки на них
    #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
Расположение объектов в памяти и ссылки на них
    #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
Расположение объектов в памяти и ссылки на них
    #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
Расположение объектов в памяти и ссылки на них
    #39984879
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
// тут fQueryParam получает значение self.qryDeduct а про self.qryAccrual забывает - он не забывает - создаются же ДВА РАЗНЫХ обехкта одного класса - память выделяется для КАЖДОГО отдельно.
...
Рейтинг: 0 / 0
Расположение объектов в памяти и ссылки на них
    #39984881
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и еще вопрос - а как на форуме код выделять? - чето [COLOR] не прокатывает у меня...
...
Рейтинг: 0 / 0
Расположение объектов в памяти и ссылки на них
    #39984887
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galadriel75
и еще вопрос - а как на форуме код выделять? - чето [COLOR] не прокатывает у меня...

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

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

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

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


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

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




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

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


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