a small extension of the MessageRequeter()

Windows specific forum
PB&J Lover
Enthusiast
Enthusiast
Posts: 212
Joined: Fri Apr 22, 2005 2:07 pm
Location: U.S.A.
Contact:

a small extension of the MessageRequeter()

Post by PB&J Lover »

Here is a procedure I use the simplify my MessageBoxes. It uses more flags than are listed in the help files (the commented ones don't work in PB).

Code: Select all

Procedure.b mb(cap.s,msg.s,flag.b,icon.b)
  Select flag
     Case 1 : flag = #MB_OKCANCEL
     Case 2 : flag = #MB_ABORTRETRYIGNORE
     Case 3 : flag = #MB_YESNOCANCEL
     Case 4 : flag = #MB_YESNO
 ;   Case 5 : flag = #MB_RETRYCANCEL
 ;   Case 6 : flag = #MB_CANCELTRYCONTINUE
    Default : flag = #MB_OK
  EndSelect

  Select icon
      Case 1 : icon = #MB_ICONEXCLAMATION       
      Case 2 : icon = #MB_ICONQUESTION
      Case 3 : icon = #MB_ICONSTOP
     Default : icon = #MB_ICONINFORMATION
  EndSelect
ProcedureReturn MessageRequester(cap,msg+"   ",flag|icon)
EndProcedure
So you'd use it like this: Result = mb("Caption","Message",0,0)

A good way to manage Warning messages is a Select/Case procedure like this:

Code: Select all

Procedure.l Warning(n.b)
typ.b = 0 : icon.b = 0
  Select n
     Case 101
      cap$ = "- Warning! -" : typ = 4 : icon = 1
      Msg$ = "Do you want to QUIT without saving? "
      
     Case 102
      cap$ = "- Sorry! -" : typ = 0 : icon = 3
      Msg$ = "The file could not be opened! "

  EndSelect
ProcedureReturn mb(cap$,Msg$,typ,icon)
EndProcedure
So in your code you can have: mbResult = Warning(101) or IF Warning(101) = 6 : END etc.

Hope this helps someone
-- DB

Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius — and a lot of courage — to move in the opposite direction.

Albert Einstein
User avatar
utopiomania
Addict
Addict
Posts: 1655
Joined: Tue May 10, 2005 10:00 pm
Location: Norway

Post by utopiomania »

Thanks for the tip :) , but my first thought was isn't this a bit upside down? Passing 0 instead of
#PB_MessageRequester_OK isn't too self documenting is it :?:
PB&J Lover
Enthusiast
Enthusiast
Posts: 212
Joined: Fri Apr 22, 2005 2:07 pm
Location: U.S.A.
Contact:

Post by PB&J Lover »

That's true, but then I just put this chart in my code or print it out. It saves room in the long run and makes the Warning procedure simpler too.
; - ******* Message Box mb() Function Parameters ********
; TYP: 0 = OK (default)
; 1 = OK CANCEL
; 2 = ABORT RETRY IGNORE
; 3 = YES NO CANCEL
; 4 = YES NO
; 5 = RETRY CANCEL
; 6 = CANCEL TRY CONTINUE
;
; ICON: 0 = Info (default) a small "i" in a bubble.
; 1 = Exclamation (in a caution triangle).
; 2 = Question Mark (in bubble).
; 3 = STOP (with X in red circle).
It works for me.
-- DB

Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius — and a lot of courage — to move in the opposite direction.

Albert Einstein
TerryHough
Enthusiast
Enthusiast
Posts: 781
Joined: Fri Apr 25, 2003 6:51 pm
Location: NC, USA
Contact:

Re: a small extension of the MessageRequeter()

Post by TerryHough »

PB&J Lover wrote:So in your code you can have: mbResult = Warning(101) or IF Warning(101) = 6 : END etc.
Did you overlook this construct?
Result = MessageRequester("Warning", "Do you want to QUIT without saving? ", #MB_OKCANCEL | #MB_ICONEXCLAMATION)
AFAIK, all of the "message box" #MB_ICON???? constants
are supported in PB. So I just use them this way since they are more
readable.
PB&J Lover
Enthusiast
Enthusiast
Posts: 212
Joined: Fri Apr 22, 2005 2:07 pm
Location: U.S.A.
Contact:

Re: a small extension of the MessageRequeter()

Post by PB&J Lover »

Did you overlook this construct?

Result = MessageRequester("Warning", "Do you want to QUIT without saving? ", #MB_OKCANCEL | #MB_ICONEXCLAMATION)
No I didn't overlook this. What this system allows me to do is shorten that construct for all the Warnings or Messages I want to put in my program. I don't repeat the long constants like: "#MB_ICONEXCLAMATION" constantly, I have it only once in my Warning() procedure. This allows this construct:

Code: Select all

IF Warning(101) = 6 : END : Endif
Which (IMHO) is much simpler than the longer construct in your example.
-- DB

Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius — and a lot of courage — to move in the opposite direction.

Albert Einstein
yashaa
User
User
Posts: 19
Joined: Sun Jun 12, 2005 8:19 pm

Re: a small extension of the MessageRequeter()

Post by yashaa »

PB&J Lover wrote: Which (IMHO) is much simpler than the longer construct in your example.
Simpler to write, harder to read :)
PB&J Lover
Enthusiast
Enthusiast
Posts: 212
Joined: Fri Apr 22, 2005 2:07 pm
Location: U.S.A.
Contact:

Post by PB&J Lover »

I must disagree here. I've already said I include a documented chart as a header to the Warning() procedure. All the Warnings are there grouped together and code is not duplicated everywhere I need the same warning/message (that's the way you should be writing your programs).

This allows simple, clean, constructs like this:

Code: Select all

Case Gadget_DDM_Main_Cancel
            If dirty <> #True        : Gosub Cancel : End 
            Else
              If Warning(105) = 6    : Gosub Cancel : End : EndIf
            EndIf
You have to understand that Warning(105) might be used 2 or 3 times in the same section of code depending on the logical flow and perhaps many more times in the whole program. Duplicating long lines of code is sloppy programming. :D It bloats your code and doesn't allow for global changes.

If I want to change the text of Warning(105) what do I do? In my system you simply change one line in the Warning() procedure and they all change. In your "easier" system you'd have to go hunting for them.

Also, if I want to use the same Warnings in a new program I just include the procedure as a file or copy it in and there you go. I have them all.

What I am suggesting is nothing new and anyone who's studied computer science will recognize the method and the reasons behind it. Here's to tighter code! :D
-- DB

Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius — and a lot of courage — to move in the opposite direction.

Albert Einstein
User avatar
SimpleMind
Enthusiast
Enthusiast
Posts: 112
Joined: Sun May 18, 2003 12:40 pm
Location: Netherlands

Post by SimpleMind »

PB&J Lover wrote:I must disagree here. I've already said I include a documented chart as a header to the Warning() procedure. All the Warnings are there grouped together and code is not duplicated everywhere I need the same warning/message (that's the way you should be writing your programs).

[...]

You have to understand that Warning(105) might be used 2 or 3 times in the same section of code depending on the logical flow and perhaps many more times in the whole program. Duplicating long lines of code is sloppy programming. :D It bloats your code and doesn't allow for global changes.

If I want to change the text of Warning(105) what do I do? In my system you simply change one line in the Warning() procedure and they all change. In your "easier" system you'd have to go hunting for them.

Also, if I want to use the same Warnings in a new program I just include the procedure as a file or copy it in and there you go. I have them all.

What I am suggesting is nothing new and anyone who's studied computer science will recognize the method and the reasons behind it. Here's to tighter code! :D
I agree PB&J Lover. What you do is nice referenced here.: http://www.duckware.com/bugfreec/chapter6.html#thekey
Give me books, fruit, french wine, fine weather and a little music.
John Keats
Post Reply