powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Двойной запуск формы
22 сообщений из 22, страница 1 из 1
Двойной запуск формы
    #39919781
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, есть вопрос, запутался немного.
Есть форма FormA с cxgrid, унаследована от FormB, далее при нажатии на грид по двойному щелчку открывается почему-то две формы на редактирование, сначала одна, потом ок нажимаешь и вторая. Хочу разобраться почему.

В FormA по щелчку грида формы определено:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
procedure TFormA.grdDictonaryDBTableViewCellDblClick(Sender : TcxCustomGridTableView; ACellViewInfo : TcxGridTableDataCellViewInfo; AButton : TMouseButton; AShift : TShiftState; var AHandled : Boolean);
Begin
  inherited; //вызов метода из базовой формы
End;

//Вызов Формы TFormB
procedure TFormA.EditRecord;
begin
  inherited;

  formB := TdFormB.Create(Self, setDictonary.FieldByName('Id').AsInteger, false);
  try
   //Do ....
  finally
    formB.Free;
  end;
end;



В FormB также определена базовая функция по двойному щелчку
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
class = TFormB
   procedure acEditExecute(Sender : TObject);
    procedure grdDictonaryDBTableViewCellDblClick(Sender : TcxCustomGridTableView; ACellViewInfo : TcxGridTableDataCellViewInfo; AButton : TMouseButton; AShift : TShiftState; var AHandled : Boolean);
 protected
    procedure EditRecord; Virtual;
.....

procedure TFormB.grdDictonaryDBTableViewCellDblClick(Sender : TcxCustomGridTableView; ACellViewInfo : TcxGridTableDataCellViewInfo; AButton : TMouseButton; AShift : TShiftState; var AHandled : Boolean);
begin
    acEditExecute(Sender); 
end;

procedure TFormB.acEditExecute(Sender : TObject);
begin
  EditRecord; //вызов EditRecord TFormA
end;
...
Рейтинг: 0 / 0
Двойной запуск формы
    #39919784
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
Метод TFormB.EditRecord пустой
procedure TFormB.EditRecord;
begin
end;
...
Рейтинг: 0 / 0
Двойной запуск формы
    #39919785
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть ли предположения?
...
Рейтинг: 0 / 0
Двойной запуск формы
    #39919788
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
Хочу разобраться почему.

Очевидно, потому что сами создаёте в наследнике экземпляр родителя.
...
Рейтинг: 0 / 0
Двойной запуск формы
    #39919790
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45, да, спасибо, это очевидно, но как подправить, неужели virtual объявить в наследнике ?
Код: sql
1.
2.
class = TFormB
    procedure grdDictonaryDBTableViewCellDblClick(Sender : TcxCustomGridTableView; ACellViewInfo : TcxGridTableDataCellViewInfo; AButton : TMouseButton; AShift : TShiftState; var AHandled : Boolean); virtual



Верно?
...
Рейтинг: 0 / 0
Двойной запуск формы
    #39919792
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точнее в предке?
Код: pascal
1.
2.
class = TFormB
    procedure grdDictonaryDBTableViewCellDblClick(Sender : TcxCustomGridTableView; ACellViewInfo : TcxGridTableDataCellViewInfo; AButton : TMouseButton; AShift : TShiftState; var AHandled : Boolean); virtual
...
Рейтинг: 0 / 0
Двойной запуск формы
    #39919794
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

Есть фолшебные кнопки F5, F7, F8 и F9 - можно пройтись по шагам с открытия первой формы и посмотреть где открывается вторая.
Или расставить точки остановка в местах где есть всякие ShowModal() и посмотреть на call stack.
...
Рейтинг: 0 / 0
Двойной запуск формы
    #39919797
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp, а без этого не очевидно?
...
Рейтинг: 0 / 0
Двойной запуск формы
    #39919841
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
alekcvp, а без этого не очевидно?

Если вам очевидно, то зачем тогда эта тема?..
...
Рейтинг: 0 / 0
Двойной запуск формы
    #39919847
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp, не очевидно, а дебагер не помогает
...
Рейтинг: 0 / 0
Двойной запуск формы
    #39919849
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
alekcvp, не очевидно, а дебагер не помогает

Стек вызовов не показывает?
...
Рейтинг: 0 / 0
Двойной запуск формы
    #39919853
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
goldmi45, да, спасибо, это очевидно, но как подправить, неужели virtual объявить в наследнике ?
Код: sql
1.
2.
class = TFormB
    procedure grdDictonaryDBTableViewCellDblClick(Sender : TcxCustomGridTableView; ACellViewInfo : TcxGridTableDataCellViewInfo; AButton : TMouseButton; AShift : TShiftState; var AHandled : Boolean); virtual



Верно?

Мне совершенно не понятно, зачем создавать экземпляр предка в наследнике. Скорее всего, вам стоит подтянуть знания по ООП, в частности что такое наследование и полиморфизм.
virtual предполагает возможность, что метод будет переопределён в наследнике. У вас такого нет, поэтому совершенно не понятно, что вы хотите добиться.
...
Рейтинг: 0 / 0
Двойной запуск формы
    #39919872
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45, перепутал я, смутив Вас, нет там не в экземпляре предка создается, дважды создается форма TFormNew.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
В FormA по щелчку грида формы определено:

TFormA = class(TFormB)

procedure TFormA.grdDictonaryDBTableViewCellDblClick(Sender : TcxCustomGridTableView; ACellViewInfo : TcxGridTableDataCellViewInfo; AButton : TMouseButton; AShift : TShiftState; var AHandled : Boolean);
Begin
  inherited; //вызов метода из базовой формы
End;

//Вызов Формы TFormNew
procedure TFormA.EditRecord;
begin
  inherited;
  formNew := TFormNew.Create(Self, setDictonary.FieldByName('Id').AsInteger, false);
  try
   //Do ....
  finally
    formNew.Free;
  end;
end;




Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
TformNew = class 
var formNew:TFormNew;



В FormB также определена базовая функция по двойному щелчку
class = TFormB
   procedure acEditExecute(Sender : TObject);
    procedure grdDictonaryDBTableViewCellDblClick(Sender : TcxCustomGridTableView; ACellViewInfo : TcxGridTableDataCellViewInfo; AButton : TMouseButton; AShift : TShiftState; var AHandled : Boolean);
 protected
    procedure EditRecord; Virtual;
.....

procedure TFormB.grdDictonaryDBTableViewCellDblClick(Sender : TcxCustomGridTableView; ACellViewInfo : TcxGridTableDataCellViewInfo; AButton : TMouseButton; AShift : TShiftState; var AHandled : Boolean);
begin
    acEditExecute(Sender); 
end;

procedure TFormB.acEditExecute(Sender : TObject);
begin
  EditRecord; //вызов EditRecord TFormA
end;
...
Рейтинг: 0 / 0
Двойной запуск формы
    #39919873
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Писал по памяти, коллеги извините, помогите понять причину все же.
...
Рейтинг: 0 / 0
Двойной запуск формы
    #39919886
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

1) у TFormB procedure EditRecord; Virtual; А у TFormA она override?
2) такой комментарий вводит в заблуждение:
wsnet
Код: pascal
1.
2.
3.
4.
procedure TFormB.acEditExecute(Sender : TObject);
begin
  EditRecord; //вызов EditRecord TFormA  вызывается EditRecord. полиморфизм отвечает, какой именно код вызовется (TFormB или TFormA)
end;


3) Вы не привели код EditRecord для TFormB. Однако в TFormA написано inherited, что означает вызов EditRecord предка.

Скорее всего, вам нужно просто убрать в EditRecord у TFormA inherited.
...
Рейтинг: 0 / 0
Двойной запуск формы
    #39919893
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45,

1. 1) у TFormB procedure EditRecord; Virtual; А у TFormA она override?
У TFormB EditRecord Virtual так точно, а у TFormA она объявлена как override;

2) такой комментарий вводит в заблуждение:
возможно, но автор не я был такового коммента

3) Вы не привели код EditRecord для TFormB. Однако в TFormA написано inherited, что означает вызов EditRecord предка.
Там пусто, то есть написано:

Код: pascal
1.
2.
3.
4.
procedure TFormB.EditRecord;
begin
 //
end;



Как быть, не очень понимаю, все же почему вызов 2 раза формы происходит?
...
Рейтинг: 0 / 0
Двойной запуск формы
    #39919898
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

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

И люди мгновенно загрузят и посмотрят, и поймут, что у тебя не так, и помогут тебе.
...
Рейтинг: 0 / 0
Двойной запуск формы
    #39919900
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
29.01.2020 13:02, ёёёёё пишет:
> И люди мгновенно загрузят и посмотрят,


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Двойной запуск формы
    #39919902
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
29.01.2020 13:02, ёёёёё пишет:
> И люди мгновенно загрузят и посмотрят,


Я - точно. Мне лишь бы не работать.
...
Рейтинг: 0 / 0
Двойной запуск формы
    #39919903
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45
wsnet,

1) у TFormB procedure EditRecord; Virtual; А у TFormA она override?
2) такой комментарий вводит в заблуждение:
wsnet
Код: pascal
1.
2.
3.
4.
procedure TFormB.acEditExecute(Sender : TObject);
begin
  EditRecord; //вызов EditRecord TFormA  вызывается EditRecord. полиморфизм отвечает, какой именно код вызовется (TFormB или TFormA)
end;


3) Вы не привели код EditRecord для TFormB. Однако в TFormA написано inherited, что означает вызов EditRecord предка.

Скорее всего, вам нужно просто убрать в EditRecord у TFormA inherited.

Уберу, но ведь в EditRecord TformB просто пусто)
...
Рейтинг: 0 / 0
Двойной запуск формы
    #39919930
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
Уберу, но ведь в EditRecord TformB просто пусто)

тогда бряк на TFormA.grdDictonaryDBTableViewCellDblClick и F7, F7, F7. Смотреть, где TFormNew.Show... Или поискать таки по проекту где (и как) ещё TFormNew создаётся (или её наследники)...
...
Рейтинг: 0 / 0
Двойной запуск формы
    #39919982
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45
wsnet
Уберу, но ведь в EditRecord TformB просто пусто)

тогда бряк на TFormA.grdDictonaryDBTableViewCellDblClick и F7, F7, F7. Смотреть, где TFormNew.Show... Или поискать таки по проекту где (и как) ещё TFormNew создаётся (или её наследники)...


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


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