Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Наследие [D6, WinXP]


Страницы:   1 2

webpauk ©   (2007-09-20 19:48:00) 

Создал форму.
Создаю на её основе наследников: TForm2 = class(TForm1)

Следующий код не работает:
procedure TForm2.btnDelClick(Sender: TObject);
begin
 inherited;
 ShowMessage('');
end;


в чём причина?


Плохиш   (2007-09-21 15:52:00) [1]

Как только они не извращаются :-))


Kolan   (2007-09-21 15:13:00) [2]

> Ты бы хоть в компиляторе свои глупости проверял для начала
> :-(

Да, действительно этож, процедура… Да это вообще полный изврат имхо…

Вот:

TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
   function SomeFoo: Integer; virtual;
 end;

 TForm2 = class(TForm1)
 public
   function SomeFoo: Integer; override;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 SomeFoo;
 with TForm2.Create(Self) do
 begin
   SomeFoo;
   Free;
 end;
end;

function TForm1.SomeFoo: Integer;
begin
 Result := MessageDlg('Удалить', mtConfirmation, [mbYes, mbNo], 0);
 if Result mrYes then
   Exit;
end;

{ TForm2 }

function TForm2.SomeFoo: Integer;
begin
 if inherited SomeFoo mrYes then
   Exit;
end;

end.


Незнаю что эта хрень делает, но кажется саюжу соответствует…


Плохиш   (2007-09-21 14:44:00) [3]


> Kolan ©   (21.09.07 14:38) [20]

Ты бы хоть в компиляторе свои глупости проверял для начала :-(


Kolan   (2007-09-21 14:38:00) [4]

> как сделать, не используя внешних переменных


Это?

procedure Tform2.btnDelClick(Sender: TObject);
begin
if inherited btnDelClick(Sender) <> mrYes then
 Exit;
end;


Плохиш   (2007-09-21 13:31:00) [5]

Надо exit заменить на abort.


webpauk   (2007-09-21 13:14:00) [6]

господа! ошибка была не в обработчике наследника,а в методе создания потомка.
есть глупый вопрос:

procedure Tform1.btnDelClick(Sender: TObject);
begin
 if messagebox('Удалить', mtconfirmation, [mbYes, mbNo], 0)<>mrYes then Exit;
end;

procedure Tform2.btnDelClick(Sender: TObject);
begin
 inherited;
end;


как сделать, не используя внешних переменных для сохранения значения вызова messagebox в классе-потомке, чтобы в классе наследнике при обработке inherited происходило прекращения обработчика Tform2.btnDelClick, если Tform1.messagebox('Удалить', mtconfirmation, [mbYes, mbNo], 0)<>mrYes


Плохиш   (2007-09-21 11:08:00) [7]

Читал посты после [6], всем спасибо, настроение с утра подняли :-))


Kolan   (2007-09-21 08:45:00) [8]

> Что и было сказано в [7]…

Я вообще-то предложил несколько другое.

TForm1 = class(TForm)
…
procedure SomeMethod; virtual;
end;

procedure TForm1.SomeMethod;
begin
 ShowMessage('TForm1');
end;
----------------------------------------------------

TForm2 = class(TForm1)
…
procedure SomeMethod; override;
end;

procedure TForm2.SomeMethod;
begin
inherited;                //Вывод — «TForm1»
ShowMessage('TForm2');    //Вывод — «TForm2»
end;


А в обработчике клика вызывать…
procedure TForm2.btnDelClick(Sender: TObject);
begin
 SomeMethod;
end;


Так имхо понятнее


{RASkov}   (2007-09-21 02:02:00) [9]

> [6] webpauk   (20.09.07 20:18)

Но если даже напишешь так
with TForm 2 .Create(Application) do
но без virtual(override), то все равно будет вызван метод из TForm1....


{RASkov}   (2007-09-21 01:59:00) [10]

> [2] webpauk   (20.09.07 20:00)

TForm1 = class(TForm)
 ....
 procedure btnDelClick(Sender: TObject); virtual;
end;

procedure TForm1.btnDelClick(Sender: TObject);
begin
ShowMessage('TForm1');
end;
----------------------------------------------------

TForm2 = class(TForm1)
 ....
 procedure btnDelClick(Sender: TObject); override;
end;

procedure TForm2.btnDelClick(Sender: TObject);
begin
inherited;                //Вывод - "TForm1"
ShowMessage('TForm2');    //Вывод - "TForm2"
end;

Что и было сказано в [7]...


tesseract   (2007-09-20 22:01:00) [11]


> Я сказал твою же мысль, только другими словами, что бы у
> него был выбор в понимание.


тогда это свойтсво процедурного объектного типа, ибо просто процедурный тип в VMT объекта не попадёт. Если маразм не изменяет. Tnotify как раз и создан дабы не париться с областью видимости.


Anatoly Podgoretsky   (2007-09-20 21:47:00) [12]


> И какая разница ? Предка, ему не полагаеться.

Я сказал твою же мысль, только другими словами, что бы у него был выбор в понимание.


Anatoly Podgoretsky   (2007-09-20 21:46:00) [13]

> tesseract  (20.09.2007 21:39:10)  [10]

Так не откуда браться предку, это же не класс и не метод.


tesseract   (2007-09-20 21:39:00) [14]


> Свойство процедурного типа.


И какая разница ? Предка, ему не полагаеться.


Anatoly Podgoretsky   (2007-09-20 21:32:00) [15]

> tesseract  (20.09.2007 21:30:08)  [8]

Свойство процедурного типа.


tesseract   (2007-09-20 21:30:00) [16]


> почему обрабатывается inherited и не обрабатывается ShowMessage('');


Откуда он у него возьмёться? Если OnClick есть ссылка на метод?


Kolan   (2007-09-20 20:25:00) [17]

Ни че не  понял кроме [5] webpauk   (20.09.07 20:11).

Сделай виртуальный метод в форме 1 и перекрывай его в форме 2 наздаровье.


webpauk   (2007-09-20 20:18:00) [18]

упс...
вызов(создание) наследника осуществлялся на основе кода:

class function TForm1.Execute(): Boolean;
begin
 with TForm1 .Create(Application) do
 begin
   try
     Result:=ShowModal=mrOk;
   finally
     Free;
   end;
 end;
end;


ошибка помечена жирным наклоном


webpauk   (2007-09-20 20:11:00) [19]

собсно говоря мне нужен override для procedure TForm2.btnDelClick(Sender: TObject);


webpauk   (2007-09-20 20:06:00) [20]


> Вася Правильный   (20.09.07 20:03) [3]

всё что прописано в Form1.btnDelClick(Sender: TObject);


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо