Das Post hat nix mit dem Exit zu tun.
Wurde ein Datensatz geändert, wird beim Wechsel eines Datensatzes (gewöhnlich) ein Post ausgelöst, was den Aufruf von BeforePost impliziert.
Ja nach verwendetem
DB-Grid kann man in den Optionen z. B. dgCancelOnExit aktivieren oder eben nicht aktivieren, sie steuert das Verhalten des Grids beim Verlassen.
Die mit dem Grid verbundene DataSource hat auch noch ein paar Eigenschaften und Ereignisse. Z. B. AutoEdit, dann kommt noch die passende TDataSet-Komponente oder einer ihrer Nachfolger dazu.
Dein Problem ist: So wie momentan die Einstellungen von DBGrid und Co. sind, sorgt jede Interaktion im Programm, die zu einem Verlassen des Grids führt, zu einem automatischen Speichern des aktuellen Datensatzes, deshalb kommt das Ereignis BeforePost
vor dem Klick auf irgendeinen beliebigen Button ... außerhalb des Grids.
Statt der Buttons könntest Du es ja mal mit 'nem DBNavigator versuchen, der bringt von Hause aus die Buttons für Cancel, Save ... mit. Welche Buttons angezeigt werden, kann man konfigurieren. Da der DBNavigator mit der gleichen DataSource verbunden ist, wie das DBGrid, tritt der von Dir festgestellte Effekt nicht auf. (Jedenfalls ist er mit in den letzten 20 Jahren so noch nicht begegnet.)
Statt eines Cancelbuttons benutze ich einfach die Taste ESC, hat die gleiche Wirkung und ist deutlich schneller erreicht