Eroare abstractă

Eroare abstractă

Crearea unui formular, fără un proiect, salvați, adăugați-l la depozitarul, atunci noul proctita, adăugat la acesta din această formă de depozitar, a inclus-o în Uzes, de asteptare procedura MyShowMessage, care creează o instanță formă de dialog, iar când apăsați butonul OK ar trebui autodistruge . Eroare de eroare În schimb Rezumat.






Ce am făcut greșit? Iată sursa dialogului de formă:

Da, o altă întrebare: cine pe glitches în forum să-i spuneți?

utilizări
Ferestre, Mesaje, SysUtils, Variante, Clase, Grafica, Controale, Formulare,
Dialoguri, StdCtrls, ExtCtrls;

procedura MyShowMessage (mMesstext, mCaption, mBtnCaption, mCheckBoxCaption: șir; mBitmap: Tbitmap;
mBitMapTransparent, mBitmapCentered, mBitmapStretch: boolean);

tip
TFormMessage = clasă (TForm)
BtnOk: TButton;
ChB: TCheckBox;
Bevel: TBevel;
Panou: TPanel;
Text: TStaticText;
Panoul 1: TPanel;
Img: TImage;
procedura BtnOkClick (expeditor: TObject);
privat

public

se încheie;

var
FormMessage: TFormMessage;

procedura TFormMessage.BtnOkClick (expeditor: TObject);
începe
FormMessage.free;
se încheie;


procedura MyShowMessage (mMesstext, mCaption, mBtnCaption, mCheckBoxCaption: șir; mBitmap: Tbitmap;
mBitMapTransparent, mBitmapCentered, mBitmapStretch: boolean);
începe
FormMessage: = TFormMessage.create (zero);
cu FormMessage do
începe
dacă mCaption<>"", apoi caption: = mCaption;
text.Caption: = mMesstext;
dacă mbitmap<>nil atunci
începe
img.Visible: = true;
img.picture.bitmap.assign (mBitmap);
se încheie;
dacă mBtnCaption<>"" apoi BtnOk.caption: = mBtnCaption;
dacă mCheckBoxCaption<>"" apoi ChB.Caption: = mCheckBoxCaption;
img.transparent: = mBitMapTransparent;
img.center:=mBitmapCentered;
img.stretch: = mBitmapStretch;
se încheie;
FormMessage.show;
se încheie;

În general, pentru astfel de scopuri, ModalResult a fost inventat de TButton, în loc de

> procedura TFormMessage.BtnOkClick (Expeditor: TObject);
> începe
> FormMessage.free;
> sfârșit;

și de obicei folosiți ShowModal

Sincer nu am înțeles. La urma urmei, forma creată de creație trebuie eliberată gratuit, chiar dacă nu am nicio idee despre ModalResult.







pur și simplu vorbind totul se face diferit

procedura MyShowMessage (mMesstext, mCaption, mBtnCaption, mCheckBoxCaption: șir; mBitmap: Tbitmap;
mBitMapTransparent, mBitmapCentered, mBitmapStretch: boolean);
var
MyDialog: TFormMessage;
începe
MyDialog: = TFormMessage.create (zero);
cu MyDialog
începe
dacă mCaption<>"", apoi caption: = mCaption;
text.Caption: = mMesstext;
dacă mbitmap<>nil atunci
începe
img.Visible: = true;
img.picture.bitmap.assign (mBitmap);
se încheie;
dacă mBtnCaption<>"" apoi BtnOk.caption: = mBtnCaption;
dacă mCheckBoxCaption<>"" apoi ChB.Caption: = mCheckBoxCaption;
img.transparent: = mBitMapTransparent;
img.center:=mBitmapCentered;
img.stretch: = mBitmapStretch;
se încheie;
FormMessage.ShowModal;
FormMessage.Free;
se încheie;

la butonul care pe o casetă de dialog proprietate ModalResult este necesar să se expună. Apoi, făcând clic pe acest buton ShowModal va reveni exact la valoarea butonului ModalResult.

1. Formularul poate fi modal, dar nu trebuie să fie.
2. Utilizatorul poate închide formularul nu numai cu butonul OK.
3. Este periculos să distrugi formularul, sunând gratuit din propriile sale metode. Există și alte modalități pentru acest lucru.
4. Variabila FormMessage nu este necesară și chiar nedorită.

1. Adăugați un handler de evenimente OnClose:

procedura TFormMessage.FormClose (expeditor: TObject; var Action: TCloseAction);
începe
Acțiune: = caFree
se încheie;

2. Schimbați butonul de preluare a butonului butonului:

procedura TFormMessage.BtnOkClick (expeditor: TObject);
începe
dacă fsModal în FormState apoi ModalResult: = mrOK altfel Close
se încheie;

3. Eliminați variabila FormMessage și schimbați procedura de afișare:

funcția MyShowMessage (.; AsModal: boolean): TModalResult;
începe
cu TFormMessage.Create (zero)
încerca
. // Configurați formularul
dacă AsModal
apoi Rezultat: = ShowModal
altceva începe
Rezultat: = mrOK;
spectacol
capăt
în cele din urmă
dacă AsModal apoi Free
capăt
se încheie;

Dialogul - nu este modalitate prin definiție?
Sau nu înțeleg corect conceptul de "dialog"

Dialogurile sunt adesea vego, desigur modale, dar acest lucru nu este strict necesar. Uneori este necesar să permiteți utilizatorului să facă ceva în fereastra principală, lăsând dialogul StayOnTop. Un exemplu este dialogul Find-Replace în MS Word.

Hmm, și dacă te gândești la cuvântul "dialog", adică la o conversație dublă, a treia este superfluă, apoi modalitate, un atribut logic pentru aceste forme. Atunci sunt "dialoguri".
Dar, desigur, ca o victimă a comodității de a lucra cu aplicația sunt făcute, cum ar fi în Word. Cred că aceasta este mai mult o excepție decât regula.

Nu poți distruge obiectul (dacă un buton de formă sau orice altceva) din propria sa auto-handler, deoarece o tratare a evenimentului este o procedură care solicită o altă metodă de același obiect, sau când ieșiți din ea, respectiv, controlul este trecut să-l numesc o metodă deja distruse obiect pe care .

> YZ (19/05/03 09:25)

Uneori poți. Dacă în lanțul traversat după apelarea liberă nu există apeluri la câmpurile unui obiect proaspăt șters, atunci totul va merge bine. Un alt lucru este că, de obicei, nu se știe dacă există astfel de apeluri sau nu. De aceea, desigur, este periculos.

Memorie: 0,75 MB
Sincronizare: 0.031 sec







Articole similare

Trimiteți-le prietenilor: