Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
1-94825
Raduga
2003-05-19 14:52
2003.05.29
определение объема занимаемой памяти


1-94819
Кирилл Ш.
2003-05-19 10:38
2003.05.29
Как написать обработчик CM_MouseLeave?


4-95156
anton
2003-02-06 09:41
2003.05.29
Как можно прослушивать каталог на появление в нем файла


1-94887
Zew
2003-05-16 16:35
2003.05.29
В трей при запуске


4-95154
Num Lock
2003-04-01 09:53
2003.05.29
Зачем посылать WM_USER после TrackPopupMenu?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский