I see that this behaviour is a bit strange, but on the other hand your code is setting the dataset into edit mode, and this has a life of its own because the first priority here is to end or cancel edit mode. In case of the grid, edit mode ends when another record is selected, or when the grid loses focus. And this is what the click on BitBtn1 is doing: the grid gives focus to the bitbtn, and this posts the record. This way the OnClick event of the button seems to be swallowed. I am not sure if this is a bug or not... But I am rather sure that attempting to change this behaviour very probably will introduce another issue somewhere else because the data-aware components are very sophisticated.
But I don't see the need for the BitBtn1 at all. As I said: saving of records is handled by the dataset internally, normally when another grid row or another control becomes active. There are only very few situations when it is required to call dataset.Post. And there is also no need to explicitly call dataset.Append from a DBGrid because when you press ENTER in the last field a new empty row will be appended automatically.
As a test, remove the GridKeyDown method and run the demo. Begin with the first field in the first row, enter something, press ENTER. The second cell becomes active, enter something, press ENTER (you will have to add dgDisplayMemo to the grid's Options for being able to enter something into a memo field). Proceed in the same way with the other cells until you reach the last cell. When you now press ENTER a new empty row will be added for the next record - there's really no need for you to code this behaviour!