Letzendlich gibt es bei einem
VCL Programm eine Schleife die ständig läuft. Diese Schleife ruft die ganze Zeit Nachrichten ab (wie Mausklicks, Zeichenanweisungen etc.). Kommt eine solche Nachricht an wird die entsprechende Funktion aufgerufen und dann geht es weiter in der Schleife bis eben der Schließenbefehl kommt.
Im groben kannst du es dir so vorstellen:
Delphi-Quellcode:
while (dont_close) do
begin
Verarbeite_Nachrichten();
end;
Wenn du jetzt Close aufrufst oder dergleichen wird nur "dont_close" (auf obiges Beispiel bezogen) auf False gesetzt und somit wäre die Schleife zu Ende und das Programm läuft bis zum Ende durch.
Das kann allerdings nur passieren wenn die Funktion "Verarbeite_Nachrichten" zurück kehrt. Hast du Beispielsweise in einem ButtonClick eine Endlosschleife kehrt "Verarbeite_Nachrichten" natürlich nicht zurück weil die Befehle in deiner ButtonClick-Methode noch abgearbeitet werden.
Wenn also nach dem Close-Befehl dein Programm noch weiter läuft ist es sehr wahrscheinlich das du noch irgendwo in einer Schleife hängst. Du kannst ja einfach mal die Pause-Taste in Delphi drücken und schauen wo das Programm dann ist (Call-Stack)
Du kannst auch einfach einen Haltepunkt bei deinem Close-Befehl setzen und dann mit F8 die folgenden Befehle der Reihen nach abarbeiten um zu sehen wo er eventuell noch hängt (wenn das nicht geht eben Pause wählen).