![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Наследие [D6, WinXP]
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);