Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Расположение объектов в памяти и ссылки на них  [new]
Galadriel75
Member

Откуда:
Сообщений: 1310
Ciao a tutti.
Мне вот интересно, почему образуется битая ссылка на объект в программе на Delphi. Что происходит с контролами в памяти в ран-тайме?
Сейчас не могу показать код, попробую на словах рассказать.
1. Обычная форма VCL, которая создается на старте приложения. На форме есть pagecontrol с двумя страницами. На каждой странице есть один грид и одна панель. На форме также валяются два adoquery.

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

Сообщение было отредактировано: 29 июл 20, 01:14
29 июл 20, 01:15    [22174916]     Ответить | Цитировать Сообщить модератору
 Re: Расположение объектов в памяти и ссылки на них  [new]
DimaBr
Member

Откуда:
Сообщений: 11808
Galadriel75
Оба объекта натягиваю на панели в первой форме. Ну, надо мне так... Все корректно инициализируется - проверил.

Плохо проверил. Наличие битых ссылок - вина программиста
29 июл 20, 02:11    [22174919]     Ответить | Цитировать Сообщить модератору
 Re: Расположение объектов в памяти и ссылки на них  [new]
Galadriel75
Member

Откуда:
Сообщений: 1310
DimaBr
Galadriel75
Оба объекта натягиваю на панели в первой форме. Ну, надо мне так... Все корректно инициализируется - проверил.

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


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

Если есть что по существу, тогда хорошо, а в ином случае - неинтересно...
29 июл 20, 10:08    [22174982]     Ответить | Цитировать Сообщить модератору
 Re: Расположение объектов в памяти и ссылки на них  [new]
asutp2
Member

Откуда: Тюмень
Сообщений: 621
Galadriel75,

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

Выкладывайте свой код.

Сообщение было отредактировано: 29 июл 20, 10:26
29 июл 20, 10:28    [22174997]     Ответить | Цитировать Сообщить модератору
 Re: Расположение объектов в памяти и ссылки на них  [new]
Galadriel75
Member

Откуда:
Сообщений: 1310
в конструкторе главной формы:
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 главной формы инициализация полей форм, которые только что создали:
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][b]frmEnterDataAccrual.setQueryParam(self.qryAccrual);[/b][/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][b]frmEnterDataAccrual.setQueryParam(self.qryDeduct);[/b][/color]
    frmEnterDataAccrual.setGridView(TcxGridDBTableView(TcxGridSite(cxGridDeduct).GridView));
    showMessage(frmEnterDataAccrual.getQueryParamSQL);
    frmEnterDataDeduct.Show;
29 июл 20, 10:44    [22175003]     Ответить | Цитировать Сообщить модератору
 Re: Расположение объектов в памяти и ссылки на них  [new]
Galadriel75
Member

Откуда:
Сообщений: 1310
frmEnterDataAccrual.setQueryParam(self.qryAccrual)
frmEnterDataAccrual.setQueryParam(self.qryDeduct) - инициализированы верно - сразу после инициализации я дернул у них SQL.text - каждый показал свой sql - объекты в памяти живут.
Когда нажимаю на кнопку:
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, ссылки на которые я передал в динамически созданную форму как бы есть, но уже где-то в другом месте в памяти.
Может так и не стоит делать, может лучше передать ссылку на всю форму, на котороую динамические формы натягиваю...
Вариантов много, как можно соорудить, но хотелось бы понять, почему в этом случае теряются объекты по ссылкам...
29 июл 20, 11:04    [22175011]     Ответить | Цитировать Сообщить модератору
 Re: Расположение объектов в памяти и ссылки на них  [new]
DimaBr
Member

Откуда:
Сообщений: 11808
Что такое fQueryParam и как он связан со всем предыдущим текстом ?
29 июл 20, 11:19    [22175018]     Ответить | Цитировать Сообщить модератору
 Re: Расположение объектов в памяти и ссылки на них  [new]
Galadriel75
Member

Откуда:
Сообщений: 1310
DimaBr
Что такое fQueryParam и как он связан со всем предыдущим текстом ?


private
    fQuery: TADOQuery;
    fDataModule : TDM_EnterData;
    fConnection : TADOConnection;
    fQueryParam : TADOQuery;
    fGridView : TcxGridDBTableView;


fQueryParam : TADOQuery;

procedure TfrmEnterData.setQueryParam(const aQueryParam: TADOQuery);
begin
  fQueryParam := aQueryParam;
  showMessage(fQueryParam.sql.text);
  log(4, '---------------------');
  paramLog(fQueryParam);
end;



fQueryParam : TADOQuery; - смотрит на тот квери, который валяется на главной форме. Проект не мой изначально. Квери я не храню на формах... Переделывать уже нет времени
29 июл 20, 11:27    [22175023]     Ответить | Цитировать Сообщить модератору
 Re: Расположение объектов в памяти и ссылки на них  [new]
DimaBr
Member

Откуда:
Сообщений: 11808
Чтобы найти по коду, где вы затираете frmEnterDataAccrual, уберите его из свойств формы и объявите такую же функцию
TMyForm=class()
  public
    New_frmEnterDataAccrual: TFrmEnterData;
    function frmEnterDataAccrual: TFrmEnterData;
end; 

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

Тогда СОЗДАТЬ ФОРМУ (присвоить новое значение на ссылку) из каких либо других мест уже не получится
29 июл 20, 11:28    [22175024]     Ответить | Цитировать Сообщить модератору
 Re: Расположение объектов в памяти и ссылки на них  [new]
DimaBr
Member

Откуда:
Сообщений: 11808
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;
29 июл 20, 11:34    [22175027]     Ответить | Цитировать Сообщить модератору
 Re: Расположение объектов в памяти и ссылки на них  [new]
Galadriel75
Member

Откуда:
Сообщений: 1310
// тут fQueryParam получает значение self.qryDeduct а про self.qryAccrual забывает - он не забывает - создаются же ДВА РАЗНЫХ обехкта одного класса - память выделяется для КАЖДОГО отдельно.
29 июл 20, 11:46    [22175038]     Ответить | Цитировать Сообщить модератору
 Re: Расположение объектов в памяти и ссылки на них  [new]
Galadriel75
Member

Откуда:
Сообщений: 1310
и еще вопрос - а как на форуме код выделять? - чето [COLOR] не прокатывает у меня...
29 июл 20, 11:47    [22175040]     Ответить | Цитировать Сообщить модератору
 Re: Расположение объектов в памяти и ссылки на них  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26714
Galadriel75
и еще вопрос - а как на форуме код выделять? - чето [COLOR] не прокатывает у меня...

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

begin
  s := 'test';
end;
29 июл 20, 11:51    [22175046]     Ответить | Цитировать Сообщить модератору
 Re: Расположение объектов в памяти и ссылки на них  [new]
Galadriel75
Member

Откуда:
Сообщений: 1310
wadman
Galadriel75
и еще вопрос - а как на форуме код выделять? - чето [COLOR] не прокатывает у меня...

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

begin
  s := 'test';
end;

ок пасиб гляну
29 июл 20, 11:58    [22175052]     Ответить | Цитировать Сообщить модератору
 Re: Расположение объектов в памяти и ссылки на них  [new]
DimaBr
Member

Откуда:
Сообщений: 11808
Galadriel75
и еще вопрос - а как на форуме код выделять? - чето [COLOR] не прокатывает у меня...

Нажмите на Цитировать и увидите, как это сделано
29 июл 20, 12:21    [22175061]     Ответить | Цитировать Сообщить модератору
 Re: Расположение объектов в памяти и ссылки на них  [new]
Galadriel75
Member

Откуда:
Сообщений: 1310
    frmEnterDataAccrual.setQueryParam(self.qryDeduct);  // тут fQueryParam получает значение self.qryDeduct а про self.qryAccrual забывает
    frmEnterDataAccrual.setGridView(TcxGridDBTableView(TcxGridSite(cxGridDeduct).GridView));



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

Всем спасибо за участие и помощь!!!!!!!!!!!!

Сообщение было отредактировано: 29 июл 20, 12:41
29 июл 20, 12:43    [22175071]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить