Abstract error

Abstract error

Створив форму, без проекту, зберіг, додав її в депозитарій, потім новий прокт, в нього додані з депозитарію цю форму, включив її в Юзес, викликаю процедуру MyShowMessage, яка створює екземпляр форми-діалогу, а при натисканні на кнопку ок вона повинна самознищиться . Замість цього виникає помилка Abstract error.
Що я зробив не так? ось исходник форми-діалогу:

Так, ще таке питання: кому на глюки в форумі розповідати?

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

public

end;

var
FormMessage: TFormMessage;

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;

вообщето для таких цілей придуманий ModalResult у TButton, замість того щоб

> Procedure TFormMessage.BtnOkClick (Sender: TObject);
> begin
> FormMessage.free;
> End;

і зазвичай використовують ShowModal

Чесно кажучи нічого не зрозумів. Адже форма створена за create зобов'язана звільнятися по free, навіть якщо я поняття не маю про ModalResult.

простіше кажучи робиться все зовсім по іншому

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 кнопки.

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;

Діалог - хіба він не модальний за визначенням?
Або я не правильно розумію поняття "діалог"

Діалоги частіше ВЕГО, звичайно модальні, але це не строго обов'язково. Іноді буває потрібно дати можливість користувачеві щось зробити і в основному вікні, залишаючи діалог StayOnTop. Приклад - діалог Find-Replace в MS Word.

Хм, а якщо задуматися над словом "діалог", тобто розмова в двоем, третій зайвий, то, модальність, логічний атрибут для цих форм. На те вони і "діалоги".
Але звичайно ж в жертву зручності роботи з додатком їх роблять такими як в Word. Мені здається це більше виняток ніж правило.

Не можна знищувати об'єкт (будь то форма, кнопка або будь-який інший) з його ж власного обробника тому, що обробник події це процедура, що викликається іншими методами цього ж об'єкта, і при виході з неї, відповідно управління буде передано викликає її методу вже знищеного Вами об'єкта .

> YZ (19.05.03 09:25)

Іноді можна. Якщо в ланцюжку, прохідною після виклику Free не буде звернень до полів свежеунічтоженного об'єкта, то все пройде нормально. Інша справа, що зазвичай невідомо, чи є такі звернення, або їх немає. Тому, звичайно, небезпечно.

Пам'ять: 0.75 MB
Час: 0.031 c

Схожі статті