If you like to capture the new record values in a dialog, that is much easier and safer.
You can use oBrw:oRs:AddNew() to create a blank record, offer edit in a dialog and then either save ( calling oBrw:oRs:Update()/UpdateBatch() ) or cancel append ( calling oBrw:oRs:CancelUpdate()/CancelBatch() ) depending on validation of the entire row.
If you want to create a blank row in the xbrowse itself and offer inline edit, you need to consider the following implications.
As you are aware you can open a recordset with adLockOptimistic or adLockBatchOptimistic.
In the first case, once you call oRs:AddNew(), you can not navigate the recordset unless you either Update() or CancelUpdate() the new row. For xbrowse it is necessary that the recordset should be navigated even after oRs:AddNew() is called and not saved/cancelled.
Therefore you need to open the RecordSet with BatchOptimistic locking.
In such a case you can add new row like this:
oBrw:bPastEof := { || If( <already in append mode>, nil, ( oBrw:oRs:AddNew(), oBrw:Refresh() ) }
You need to have your own logic inside your program to decide if there is already one new row that is yet to be edited and saved.
You also need to deal with situations when the user does not edit anything in the new row but moves to another existing row. In such a case you need to cancel the new row.
All this logic you need to create inside your program and xbrowse does not help by itself.
If you still want to to go ahead, first let me know the FWH version you are using.