Текущий архив: 2007.10.14;
Скачать: CL | DM;
Вниз
Наследие Найти похожие ветки
← →
webpauk (2007-09-20 19:48) [0]Создал форму.
Создаю на её основе наследников:TForm2 = class(TForm1)
Следующий код не работает:procedure TForm2.btnDelClick(Sender: TObject);
begin
inherited;
ShowMessage("");
end;
в чём причина?
← →
Anatoly Podgoretsky © (2007-09-20 19:51) [1]> webpauk (20.09.2007 19:48:00) [0]
И что?
← →
webpauk (2007-09-20 20:00) [2]в чём ошибка?
почему обрабатывается inherited и не обрабатывается ShowMessage("");
← →
Вася Правильный (2007-09-20 20:03) [3]
> обрабатывается inherited
и чево он делает в обработчике кнопки?
← →
webpauk (2007-09-20 20:06) [4]
> Вася Правильный (20.09.07 20:03) [3]
всё что прописано в Form1.btnDelClick(Sender: TObject);
← →
webpauk (2007-09-20 20:11) [5]собсно говоря мне нужен override для
procedure TForm2.btnDelClick(Sender: TObject);
← →
webpauk (2007-09-20 20:18) [6]упс...
вызов(создание) наследника осуществлялся на основе кода:class function TForm1.Execute(): Boolean;
begin
with TForm1.Create(Application) do
begin
try
Result:=ShowModal=mrOk;
finally
Free;
end;
end;
end;
ошибка помечена жирным наклоном
← →
Kolan © (2007-09-20 20:25) [7]Ни че не понял кроме [5] webpauk (20.09.07 20:11).
Сделай виртуальный метод в форме 1 и перекрывай его в форме 2 наздаровье.
← →
tesseract © (2007-09-20 21:30) [8]
> почему обрабатывается inherited и не обрабатывается ShowMessage("");
Откуда он у него возьмёться? Если OnClick есть ссылка на метод?
← →
Anatoly Podgoretsky © (2007-09-20 21:32) [9]> tesseract (20.09.2007 21:30:08) [8]
Свойство процедурного типа.
← →
tesseract © (2007-09-20 21:39) [10]
> Свойство процедурного типа.
И какая разница ? Предка, ему не полагаеться.
← →
Anatoly Podgoretsky © (2007-09-20 21:46) [11]> tesseract (20.09.2007 21:39:10) [10]
Так не откуда браться предку, это же не класс и не метод.
← →
Anatoly Podgoretsky © (2007-09-20 21:47) [12]
> И какая разница ? Предка, ему не полагаеться.
Я сказал твою же мысль, только другими словами, что бы у него был выбор в понимание.
← →
tesseract © (2007-09-20 22:01) [13]
> Я сказал твою же мысль, только другими словами, что бы у
> него был выбор в понимание.
тогда это свойтсво процедурного объектного типа, ибо просто процедурный тип в VMT объекта не попадёт. Если маразм не изменяет. Tnotify как раз и создан дабы не париться с областью видимости.
← →
{RASkov} © (2007-09-21 01:59) [14]> [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]...
← →
{RASkov} © (2007-09-21 02:02) [15]> [6] webpauk (20.09.07 20:18)
Но если даже напишешь такwith TForm2.Create(Application) do
но без virtual(override), то все равно будет вызван метод из TForm1....
← →
Kolan © (2007-09-21 08:45) [16]> Что и было сказано в [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;
Так имхо понятнее
← →
Плохиш © (2007-09-21 11:08) [17]Читал посты после [6], всем спасибо, настроение с утра подняли :-))
← →
webpauk (2007-09-21 13:14) [18]господа! ошибка была не в обработчике наследника,а в методе создания потомка.
есть глупый вопрос: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 13:31) [19]Надо exit заменить на abort.
← →
Kolan © (2007-09-21 14:38) [20]> как сделать, не используя внешних переменных
Это?procedure Tform2.btnDelClick(Sender: TObject);
begin
if inherited btnDelClick(Sender) <> mrYes then
Exit;
end;
← →
Плохиш © (2007-09-21 14:44) [21]
> Kolan © (21.09.07 14:38) [20]
Ты бы хоть в компиляторе свои глупости проверял для начала :-(
← →
Kolan © (2007-09-21 15:13) [22]> Ты бы хоть в компиляторе свои глупости проверял для начала
> :-(
Да, действительно этож, процедура… Да это вообще полный изврат имхо…
Вот: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 15:52) [23]Как только они не извращаются :-))
Страницы: 1 вся ветка
Текущий архив: 2007.10.14;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.041 c