Some more tips:
* make sure there is no interference between the ui_page IDs of the object and the macro. Everyone should know exactly which pages they are responsible for. Either pass down the necessary data to the macro via parameters, or hardcode the page IDs in both places. In our door objects, we have a macro containing the hardcoded IDs, and we call that macro in each interface script where a new tabpage is inicialized. You don”t have to do this in case you have a handful of pages alltogether, just hardcode the IDs exactly the same way in all places belonging to the same UI tabpage set.
* the warning “FieldID ‘1’ previously defined at…” usually appears if you have more than one listfield in the tabpage set, and their listfield ID-s are conflicting. In case there is only one listfield/tabpage, it is best to use the tabpage ID as listfield ID (theoretically tabpage ID-s should be unique). In case you have more than one listfield on a tabpage, you should come up with a unique listfield ID a different way.
* listfields can have listitems defined in different places, see here. You do not have to duplicate the listfield in case some items are added in a macro.