I'm sure others can chime in on the many ways to do this. But simplest solution for me (only user), was to make another identical layout of almost all merge fields in place of all the data fields. On the layout I have an 'Edit' button which is just a Go to Layout step. That button takes me to the 'Data Entry Layout' where I can change info. When the record is committed, I have a trigger that uses the Go to Layout step to take me back to the original layout.
If you want to set a value in a field to lock them you can use a validation field option with the calculation option:
IsEmpty ( LockField )
If lockField is defined in the same table as the fields where you add this lock expression, setting any value in this field will cause a validation error message to pop up for any field that is defined with this field option in the same record.
If you want to lock the fields for every record in your table, make LockField a global field or global variable and then setting a single value will lock the fields for all records in the table.
Note: With this option set, you can still enter and modify data, but you'll get an error message and a button that can revert the change when you exit the field. That should be sufficient to prevent accidents, but there are other options you can set up that allow you to provide your own more user friendly layout or that selectively prevent a user from entering a field through the use of script triggers.