Pues me alegro que lo hayas solucionado, así que ahora toca un detalle que puede darte dolores de cabeza, realmente no se ha comentado en el hilo.
Es el Owner de cada MenuItem. Si necesitas destruir los menús que acabas de crear, porque entra un usuario diferente en el sistema, Delphi podría intentar liberarlos otra vez al finalizar la aplicación, y entonces, podrías recibir errores extraños (access violation, index out of bound, etc).
La sentencia clave es esta:
Código Delphi
[-]
mnu := TMenuItem.Create(ppPredef);
Con eso se le dice a Delphi que al destruir el ppPredef (TmainMenú o TpopupMenu), éste se encargue de liberar el "mnu" creado.
Si haces alguna rutina para destruir los menús, es cuando puede venir el fallo, en este caso
y sólo en este caso, usa:
Código Delphi
[-]
mnu := TMenuItem.Create(nil);
Para decirle a Delphi que nadie (nil) se encargará de destruirlos porque lo haces tú en esa rutina que hablo.
Saludos.