Question is, how to browse messages, without deleting them from MQ?

I did it with Delphi.

You will need to change GetMsgOptions, at me it is like:

MQGMO_DEFAULT : MQGMO = (StrucId:MQGMO_STRUC_ID;
  Version:MQGMO_VERSION_1;
 Options:MQGMO_NO_WAIT;
  WaitInterval:0;
  Signal1:0;
  Signal2:0;
  ResolvedQName:#0;
  MatchOptions:(MQMO_MATCH_MSG_ID+MQMO_MATCH_CORREL_ID);
  GroupStatus:MQGS_NOT_IN_GROUP;
  SegmentStatus: MQSS_NOT_A_SEGMENT;
  Segmentation:MQSEG_INHIBITED;
  Reserved1:' ';
  MsgToken:($0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0);
  ReturnedLength:MQRL_UNDEFINED;
  );

In MQIC.pas which I downloaded it from here, I changed MQGMO_DEFAULT to:

MQGMO_DEFAULT : MQGMO = (StrucId:MQGMO_STRUC_ID;
  Version:MQGMO_VERSION_1;
  Options:(MQGMO_BROWSE_NEXT + MQGMO_NO_WAIT);
  WaitInterval:0;
  Signal1:0;
  Signal2:0;
  ResolvedQName:#0;
  MatchOptions:(MQMO_MATCH_MSG_ID+MQMO_MATCH_CORREL_ID);
  GroupStatus:MQGS_NOT_IN_GROUP;
  SegmentStatus: MQSS_NOT_A_SEGMENT;
  Segmentation:MQSEG_INHIBITED;
  Reserved1:' ';
  MsgToken:($0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0);
  ReturnedLength:MQRL_UNDEFINED;
);

I added MQGMO_BROWSE_NEXT, but, before geting messages, you will need to open MQ for browsing messages, you will do it like this:

Open(MQOO_FAIL_IF_QUIESCING + MQOO_INPUT_SHARED + MQOO_BROWSE, strObjectName, intReason, bolOk);

And that is all...