Текущий архив: 2003.05.29;
Скачать: CL | DM;
Вниз
Abstract error Найти похожие ветки
← →
Мыш (2003-05-14 19:05) [0]Создал форму, без проекта, сохранил, добавил ее в депозитарий, потом новый прокт, в него добавли из депозитария эту форму, включил ее в юзес, вызываю процедуру MyShowMessage, которая создает экземпляр формы-диалога, а при нажатии на кнопку ок она должна самоуничтожится. Вместо этого возникает ошибка Abstract error.
Что я сделал не так? вот исходник формы-диалога:
Да, еще такой вопрос: кому на глюки в форуме рассказывать?
unit mm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
procedure MyShowMessage(mMesstext,mCaption,mBtnCaption,mCheckBoxCaption:string;mBitmap:Tbitmap;
mBitMapTransparent,mBitmapCentered,mBitmapStretch:boolean);
type
TFormMessage = class(TForm)
BtnOk: TButton;
ChB: TCheckBox;
Bevel: TBevel;
Panel: TPanel;
Text: TStaticText;
Panel1: TPanel;
Img: TImage;
procedure BtnOkClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FormMessage: TFormMessage;
implementation
{$R *.dfm}
procedure TFormMessage.BtnOkClick(Sender: TObject);
begin
FormMessage.free;
end;
procedure MyShowMessage(mMesstext,mCaption,mBtnCaption,mCheckBoxCaption:string;mBitmap:Tbitmap;
mBitMapTransparent,mBitmapCentered,mBitmapStretch:boolean);
begin
FormMessage:=TFormMessage.create(nil);
with FormMessage do
begin
if mCaption<>"" then caption:=mCaption;
text.Caption:=mMesstext;
if mbitmap<>nil then
begin
img.Visible:=true;
img.picture.bitmap.assign(mBitmap);
end;
if mBtnCaption<>"" then BtnOk.caption:= mBtnCaption;
if mCheckBoxCaption<>"" then ChB.Caption:=mCheckBoxCaption;
img.transparent:=mBitMapTransparent;
img.center:=mBitmapCentered;
img.stretch:=mBitmapStretch;
end;
FormMessage.show;
end;
end.
← →
Palladin (2003-05-14 19:32) [1]вообщето для таких целей придуман ModalResult у TButton, вместо того чтобы
> procedure TFormMessage.BtnOkClick(Sender: TObject);
> begin
> FormMessage.free;
> end;
и обычно используют ShowModal
← →
мыш (2003-05-14 23:52) [2]Честно говоря ничего не понял. Ведь форма созданная по create обязана освобождаться по free, даже если я понятия не имею о ModalResult.
← →
Palladin (2003-05-15 08:25) [3]Конечно не понял.
Посмотрел бы как заносить модальные диалоги в dll (есть статья помему на этом сайте) и увидел бы схему...
проще говоря делается все совсем по другому
procedure MyShowMessage(mMesstext,mCaption,mBtnCaption,mCheckBoxCaption:string;mBitmap:Tbitmap;
mBitMapTransparent,mBitmapCentered,mBitmapStretch:boolean);
var
MyDialog:TFormMessage;
begin
MyDialog:=TFormMessage.create(nil);
with MyDialog do
begin
if mCaption<>"" then caption:=mCaption;
text.Caption:=mMesstext;
if mbitmap<>nil then
begin
img.Visible:=true;
img.picture.bitmap.assign(mBitmap);
end;
if mBtnCaption<>"" then BtnOk.caption:= mBtnCaption;
if mCheckBoxCaption<>"" then ChB.Caption:=mCheckBoxCaption;
img.transparent:=mBitMapTransparent;
img.center:=mBitmapCentered;
img.stretch:=mBitmapStretch;
end;
FormMessage.ShowModal;
FormMessage.Free;
end;
у кнопки которая на диалоговом окне свойство ModalResult нужно выставить. Тогда по нажатию на эту кнопку ShowModal вернет именно значение ModalResult кнопки...
← →
Юрий Зотов (2003-05-15 08:56) [4]1. Форма может быть модальной, но не обязана ею быть.
2. Юзер может закрыть форму не только кнопкой OK.
3. Опасно уничтожать форму вызовом Free из ее же собственных методов. Для этого существуют другие способы.
4. Переменная FormMessage не нужна и даже нежелательна.
Поэтому:
1. Добавьте обработчик события OnClose:
procedure TFormMessage.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree
end;
2. Измените обработчик нажатия на кнопку:
procedure TFormMessage.BtnOkClick(Sender: TObject);
begin
if fsModal in FormState then ModalResult := mrOK else Close
end;
3. Уберите переменную FormMessage, а процедуру показа измените:
function MyShowMessage(...; AsModal: boolean): TModalResult;
begin
with TFormMessage.Create(nil) do
try
... // Настройка формы
if AsModal
then Result := ShowModal
else begin
Result := mrOK;
Show
end
finally
if AsModal then Free
end
end;
← →
Palladin (2003-05-15 09:37) [5]Диалог - разве он не модальный по определению?
Или я не правильно понимаю понятие "диалог"
← →
Юрий Зотов (2003-05-15 12:32) [6]> Palladin © (15.05.03 09:37)
Диалоги чаще вего, конечно модальные, но это не строго обязательно. Иногда бывает нужно дать возможность юзеру что-то сделать и в основном окне, оставляя диалог StayOnTop. Пример - диалог Find-Replace в MS Word.
← →
Anatoly Podgoretsky (2003-05-15 12:37) [7]Palladin © (15.05.03 09:37)
Я бы к диалогам отнес формы, которые не имею меню и как правило фиксированного размера, предназначенные для указания данных используемые в дальнейшем для выполнения операции, то есть как логическое, а не физическое понятие.
← →
Palladin (2003-05-15 13:04) [8]Хм, а если задуматься над словом "диалог", то есть разговор в двоем, третий лишний, то, модальность, логичный аттрибут для этих форм. На то они и "диалоги".
Но конечно же в жертву удобства работы с приложением их делают такими как в Word. Мне кажется это больше исключение чем правило.
← →
Anatoly Podgoretsky (2003-05-15 13:09) [9]Это точно
← →
YZ (2003-05-19 09:25) [10]Нельзя уничтожать объект (будь то форма, кнопка или любой другой) из его же собственного обработчика потому, что обработчик события это процедура, вызываемая другими методами этого же объекта, и при выходе из неё, соответственно управление будет передано вызывавшему её методу уже уничтоженного Вами объекта.
← →
Юрий Зотов (2003-05-19 10:39) [11]> YZ (19.05.03 09:25)
Иногда можно. Если в цепочке, проходимой после вызова Free не будет обращений к полям свежеуничтоженного объекта, то все пройдет нормально. Другое дело, что обычно неизвестно, есть ли такие обращения, или их нет. Поэтому, конечно, опасно.
Страницы: 1 вся ветка
Текущий архив: 2003.05.29;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.007 c