Får du din fejl ved første eller anden if sætning, eller ved exit fra funktionen. Prøv at sætte breakpoint i linien med if (BeenChanged) og lav et watch på Sender (stil cursoren på Sender og tast ctrl+F5 eller højreklik og vælg Debug->Add Watch at cursor) og se om det er din Form1.
Lav evt. et check inden if (Been..) på om Sender = this
Har ikke lige prøvet det du skrev, men er det vigtigt at det er Form1 der er Sender??? (Ikke fordi det ikke er Form1. Meget lille program, uden andre forms og lignende!)
Nej, det er absolut ikke nødvendigt. Det kunne jo være at FormClose blev kaldt når brugeren valgte File|Exit. Men hvis du sidder og debugger programmet og klikker på krydset oppe i hjørnet, så giver det et fingerpeg om at der er noget der er galt, hvis Sender ikke er Form1.
Jeg kan ikke gennemskue ud fra din kodestump, hvad der er galt, men jeg ville gætte på at BeenChanged ligger i private delen af Form1, og jeg kunne også forestille mig, at det er i den linie, at det går galt. Eller også ved udgangen af FormClose. Du bliver lige nødt til at skrive præcist, hvad der går galt og hvor, hvis du ikke har fået løst problemet endnu.
Hvad søren mener du med \"anden gang jeg kører OnClose\" ???
OnClose eventen bliver \"fyret\" af i det øjeblik du lukker formen, lige inden formens destructor. Hvis din OnClose event handler køres to gange for den samme form, ja så er formen jo blevet destruct\'ed efter første kald, og et forsøg på at bruge TForm1 variablen som pointer i andet kald, vil selvfølgelig så resultere i en \'Protection Error\'.
Jeg har lavet (formentlig næsten) samme application, med BeenChanged som Private på formen:
class TForm1 : public TForm { __published: // IDE-managed Components TButton *Button1; void __fastcall FormClose(TObject *Sender, TCloseAction &Action); void __fastcall Button1Click(TObject *Sender); private: // User declarations bool BeenChanged; public: // User declarations __fastcall TForm1(TComponent* Owner); };
og følgende constructor/handlers (Formen har en knap der sætter BeenChanged til true):
FormCloseQuery bliver kaldt for at checke om Windows må lukke applicationen - hvis applikationen tillader dette (hvad den gør hvis du ikke har kodet andet), så genererer windows en OnClose event, som bliver behandlet af FormClose. (Jeg har lige prøvet - og jo - den er god nok.)
Noget helt andet er at du har ret i forhold til hvor BeenChanged checket burde ligge, for Windows forventer jo at OnClose event handleren rent faktisk lukker formen. tokelil\'s konstruktion gør, at dette ikke nødvendigvis er tilfældet - men det opdager windows aldrig !
Det jeg mener med anden gang jeg køre OnClose, er hvis jeg første gang jeg jeg vælger exit fra Formen, samtidig vælger No til at exit\'e i MessageDlg\'en, for derefter at trykke exit når jeg kommer ind i programmet igen, og igen vælger No når den spørger om jeg vil exit. Anden gang jeg vælger No kommer der en generel beskyttelses fejl! Det sket ikke første gang!
Var egenlig bange for at jeg brugte Action forkert i C++, da det er første gang jeg bruger den efter skidt fra Delphi. Og nogen ting, så som pointere og lign., er lidt mere besværlige i C++...
Troede egenlig kun at OnCloseQuery blev kaldt når Windows spørgere om programmet må lukkes... Og ikke når brugeren lukker programmet. Men man lære jo noget nyt hver eneste dag!
Det vil sige at man egenlig skal lave spørgsmål til brugeren i OnCloseQuery og ryde om i OnClose?
Det er lige præcis hvad man skal - Messageboxen skal du lægge ind i OnCloseQuery, selve oprydningen i OnClose.
Det må være noget andet der gør at du går ned - uanset hvad jeg gør i forhold til OnClose, så får jeg ikke fejlen. Kalder du måske functionen Close() et eller andet sted - f.eks. et sted som også kaldes fra FormClose ??? Denne form for recursion vil gå godt første gang - men ikke anden.
Flyttede MessageDlg() til FormCloseQuery istedet, og så virker det som det skal!
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.