Modala former erbjuder specifika funktioner som vi inte kan ha när vi visar icke-modellt. Oftast kommer vi att visa en form formellt för att isolera dess processer från allt som annars skulle kunna hända på huvudformen. När dessa processer är klar kanske du vill veta om användaren tryckte på Spara eller Avbryt för att stänga modalformuläret. Du kan skriva en intressant kod för att uppnå detta, men det behöver inte vara svårt. Delphi levererar modala former med egenskapen ModalResult, som vi kan läsa för att berätta hur användaren lämnade formuläret.
Följande kod returnerar ett resultat, men anropsrutinen ignorerar det:
var F: TForm2; Börja F: = TForm2.Create (noll); F.ShowModal; F.Release; ...
Exemplet ovan visar bara formen, låter användaren göra något med det och sedan släpper det. För att kontrollera hur formuläret avslutades måste vi dra fördel av det faktum att ShowModal-metoden är en funktion som returnerar ett av flera ModalResult-värden. Ändra raden
F.ShowModal
till
om F.ShowModal = mrOk sedan
Vi behöver någon kod i modalform för att ställa in vad det är som vi vill hämta. Det finns mer än ett sätt att få ModalResult eftersom TForm inte är den enda komponenten som har en ModalResult-egenskap - TButton har också en.
Låt oss först titta på TButtons ModalResult. Starta ett nytt projekt och lägg till ytterligare ett formulär (Delphi IDE-huvudmenyn: File -> New -> Form). Den här nya formen kommer att ha ett "Form2" -namn. Lägg sedan till en TButton (Namn: 'Button1') i huvudformuläret (Form1), dubbelklicka på den nya knappen och ange följande kod:
procedur TForm1.Button1Click (avsändare: TObject); var f: TForm2; Börja f: = TForm2.Create (noll); Provaom f. ShowModal = mrOk sedan Bildtext: = 'Ja' annan Bildtext: = 'Nej'; till sist f. Släpp; slutet; slutet;
Välj nu det ytterligare formuläret. Ge det två TButtons, märk en "Spara" (Namn: 'btnSave'; Bildtext: 'Spara') och den andra 'Avbryt' (Namn: 'btnCancel'; Bildtext: 'Avbryt'). Välj Spara-knappen och tryck på F4 för att få fram objektinspektören, bläddra upp / ner tills du hittar egenskapen ModalResult och ställ in den till mrOk. Gå tillbaka till formuläret och välj Avbryt-knappen, tryck på F4, välj egenskapen ModalResult och ställ in den till mrCancel.
Så enkelt är det. Tryck nu på F9 för att köra projektet. (Beroende på dina miljöinställningar kan Delphi be om att spara filerna.) När huvudformuläret visas, tryck på knappen1 du lagt till tidigare för att visa underordningsformuläret. När barnformuläret visas trycker du på Spara-knappen och formuläret stängs, en gång tillbaka till huvudformuläret att det finns bildtexten "Ja". Tryck på huvudformulärets knapp för att få fram underformuläret igen men den här gången tryck på Avbryt-knappen (eller System-menyn Stäng objekt eller [x] -knappen i bildtexten). Huvudformulärens bildtexter kommer att läsa "Nej".
Hur fungerar detta? För att ta reda på det, ta en titt på Click-evenemanget för TButton (från StdCtrls.pas):
procedur TButton. Klick; var Form: TCustomForm; Börja Form: = GetParentForm (Själv); om Form noll sedan Form. ModalResult: = ModalResult; ärvt Klick; slutet;
Vad som händer är att Ägare (i detta fall den sekundära formen) av TButton får sin ModalResult-uppsättning enligt värdet på TButtons ModalResult. Om du inte ställer in TButton. ModalResult, då är värdet mrNone (som standard). Även om TButton placeras på en annan kontroll används moderformuläret fortfarande för att ställa in resultatet. Den sista raden åberopar sedan Click-händelsen som ärvts från sin förfäderklass.
För att förstå vad som händer med Forms ModalResult är det värt att granska koden i Forms.pas, som du borde kunna hitta i.. \ DelphiN \ Source (där N representerar versionnumret).
I TForms ShowModal-funktion, direkt efter att formen visas, startar Repeat-Till-slingan, som fortsätter att kontrollera om variabeln ModalResult blir ett värde större än noll. När detta inträffar stänger den slutliga koden formuläret.
Du kan ställa in ModalResult vid designtid, som beskrivits ovan, men du kan också ställa in formens egenskap ModalResult direkt i kod vid körning.