Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Двойной запуск формы / 22 сообщений из 22, страница 1 из 1
29.01.2020, 10:03
    #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
29.01.2020, 10:10
    #39919784
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной запуск формы
Код: pascal
1.
2.
3.
4.
Метод TFormB.EditRecord пустой
procedure TFormB.EditRecord;
begin
end;
...
Рейтинг: 0 / 0
29.01.2020, 10:10
    #39919785
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной запуск формы
Есть ли предположения?
...
Рейтинг: 0 / 0
29.01.2020, 10:14
    #39919788
goldmi45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной запуск формы
wsnet
Хочу разобраться почему.

Очевидно, потому что сами создаёте в наследнике экземпляр родителя.
...
Рейтинг: 0 / 0
29.01.2020, 10:17
    #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
29.01.2020, 10:18
    #39919792
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной запуск формы
Точнее в предке?
Код: pascal
1.
2.
class = TFormB
    procedure grdDictonaryDBTableViewCellDblClick(Sender : TcxCustomGridTableView; ACellViewInfo : TcxGridTableDataCellViewInfo; AButton : TMouseButton; AShift : TShiftState; var AHandled : Boolean); virtual
...
Рейтинг: 0 / 0
29.01.2020, 10:23
    #39919794
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной запуск формы
wsnet,

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

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

Стек вызовов не показывает?
...
Рейтинг: 0 / 0
29.01.2020, 11:52
    #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
29.01.2020, 12:18
    #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
29.01.2020, 12:19
    #39919873
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной запуск формы
Писал по памяти, коллеги извините, помогите понять причину все же.
...
Рейтинг: 0 / 0
29.01.2020, 12:34
    #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
29.01.2020, 12:44
    #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
29.01.2020, 13:02
    #39919898
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной запуск формы
wsnet,

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

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


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


Я - точно. Мне лишь бы не работать.
...
Рейтинг: 0 / 0
29.01.2020, 13:11
    #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
29.01.2020, 14:18
    #39919930
goldmi45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной запуск формы
wsnet
Уберу, но ведь в EditRecord TformB просто пусто)

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

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


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


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