home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / spdos2.zip / LIBSRC / PMDIALOG.PAS < prev    next >
Pascal/Delphi Source File  |  1994-06-21  |  9KB  |  303 lines

  1. UNIT PMDialog;
  2.  
  3. {**************************************************************************
  4. *                                                                         *
  5. *                                                                         *
  6. *                                                                         *
  7. *          General Unit for Object-PM  (C) 1993,94 R. Nürnberger          *
  8. *                                                                         *
  9. *                                                                         *
  10. ***************************************************************************}
  11.  
  12.  
  13. INTERFACE
  14.  
  15. USES PMObject;
  16.  
  17.  
  18.  
  19. TYPE TDialog=OBJECT
  20.                    HwndDlg:Hwnd;
  21.                    {*******Do not change this location -- its hard coded***}
  22.                    FUNCTION DialogHandleEvent(Dlg:HWND;msg:LONGWORD;
  23.                                         Para1,Para2:LONGWORD;VAR Handled:BOOLEAN):
  24.                                         LONGWORD;
  25.                    {*******************************************************}
  26.                    CONSTRUCTOR Init(Parent,Owner:HWND;hmod:HModule;idDlg:LONGWORD;
  27.                                     pCreateParams:Pointer);
  28.                    DESTRUCTOR Done;
  29.                    PROCEDURE ExecDialog;
  30.                    PROCEDURE GetDlg(VAR Dlg:HWND);
  31.              END;
  32.  
  33.  
  34. VAR FileOpenDlgWildCards:STRING;
  35.     FileOpenDlgTitle:String[40];
  36.     FileOpenDlgOkName:String[40];
  37.     FileSaveDlgWildCards:STRING;
  38.     FileSaveDlgTitle:String[40];
  39.     FileSaveDlgOkName:String[40];
  40.     DialogVMT:POINTER;
  41.  
  42.  
  43. FUNCTION FileOpenDialog(Win:HWND;Wildcards:String;VAR result:String):Boolean;
  44. FUNCTION FileSaveDialog(Win:HWND;Wildcards:String;VAR result:String):Boolean;
  45.  
  46.  
  47. IMPLEMENTATION
  48.  
  49. IMPORTS {Private}
  50.        FUNCTION WinLoadDlg(pCreateParams:POINTER;idDld:LONGWORD;
  51.                            hmod:HMODULE;DlgProc:POINTER;Owner:HWND;
  52.                            Parent:HWND):LONGWORD:   PMWIN index 924;
  53.        FUNCTION WinProcessDlg(hwndDlg:HWND):LONGWORD: PMWIN index 796;
  54.        FUNCTION WinDefDlgProc(Para2,Para1:POINTER;msg:LONGWORD;hwnddlg:HWND):
  55.                            LONGWORD:    PMWIn index 910;
  56.        FUNCTION WinDestroyWindow(_hwnd:HWND):
  57.                                     LONGWORD:              PMWIN index 728;
  58. END;
  59.  
  60. PROCEDURE TDialog.GetDlg(VAR Dlg:HWND);
  61. BEGIN
  62.      Dlg:=hwnddlg;
  63. END;
  64.  
  65.  
  66. FUNCTION TDialog.DialogHandleEvent(Dlg:HWND;msg:LONGWORD;Para1,Para2:
  67.                              LONGWORD;VAR Handled:BOOLEAN):LONGWORD;
  68. VAR H:BOOLEAN;
  69.     r:LONGWORD;
  70. BEGIN
  71.      r:=0;
  72.      H:=FALSE;
  73.      Handled:=H;
  74.      DialogHandleEvent:=r;
  75. END;
  76.  
  77.  
  78. PROCEDURE StdDlgProc(para2,para1:POINTER;Msg,Win:LONGWORD);ASM;
  79. BEGIN
  80.      ASM
  81.         PUSH EBP
  82.         MOV EBP,ESP
  83.         SUB ESP,2
  84.         MOVW [EBP-2],0   ;Not Handled
  85.         PUSHL $Win
  86.         PUSHL $Msg
  87.         PUSHL $para1
  88.         PUSHL $para2
  89.         LEA EAX,[EBP-2]  ;Handled
  90.         PUSH EAX
  91.         MOV EDI,_DialogVMT
  92.         PUSH EDI         ;VMT Pointer
  93.         MOV EDI,[EDI+0]  ;get VMT pointer for AppHandleEvent
  94.         db ffh,17h       ;CALL NEAR32 [EDI+0] --> in Methode springen
  95.         MOV BL,[EBP-2]
  96.         CMP BL,0
  97.         JNE !hh
  98.         ;not handled
  99.         ;Default Dialog handler
  100.         PUSHL $para2
  101.         PUSHL $para1
  102.         PUSHL $msg
  103.         PUSHL $win
  104.         MOV AL,4
  105.         CALLDLL PMWin,910   ;WinDefDlgProc
  106.         ADD ESP,16
  107. !hh:
  108.         LEAVE
  109.         RETN32
  110.      END;
  111. END;
  112.  
  113. CONSTRUCTOR TDialog.Init(Parent,Owner:HWND;hmod:HModule;idDlg:LONGWORD;
  114.                          PCreateParams:Pointer);
  115. BEGIN
  116.      DialogVMT:=SELF;
  117.      hwnddlg:=WinLoadDlg(PCreateParams,idDlg,hmod,@StdDlgProc,Owner,Parent);
  118. END;
  119.  
  120. DESTRUCTOR TDialog.Done;
  121. BEGIN
  122. END;
  123.  
  124. PROCEDURE TDialog.ExecDialog;
  125. BEGIN
  126.      WinProcessDlg(hwnddlg);
  127.      WinDestroyWindow(hwnddlg);
  128. END;
  129.  
  130.  
  131. TYPE PFileDlg=^FileDlg;
  132.      FileDlg=record
  133.                    cbSize:LONGWORD;        { Size of FILEDLG structure.}
  134.                    fl:LONGWORD;            { FDS_ flags. Alter behavior of dlg. }
  135.                    ulUser:LONGWORD;        { User defined field. }
  136.                    lReturn:LONGWORD;       { Result code from dialog dismissal. }
  137.                    lSRC:LONGWORD;          { System return code. }
  138.                    pszTitle:POINTER;       { String to display in title bar.}
  139.                    pszOKButton:POINTER;    { String to display in OK button. }
  140.                    pfnDlgProc:POINTER;     { Entry point to custom dialog proc. }
  141.                    pszIType:POINTER;       { Pointer to string }
  142.                    papszITypeList:POINTER;
  143.                    pszIDrive:POINTER;
  144.                    papszIDriveList:POINTER;
  145.                    hMod:LONGWORD;   { Custom File Dialog template.       }
  146.                    szFullFile:ARRAY[0..259] OF Char;
  147.                    papszFQFilename:POINTER;
  148.                    ulFQFCount:LONGWORD;  { Number of files selected }
  149.                    usDlgId:WORD;         { Custom dialog id.}
  150.                    x:WORD;               { X coordinate of the dialog  }
  151.                    y:WORD;               { Y coordinate of the dialog  }
  152.                    sEAType:WORD;         { Selected files EA Type. }
  153.              END;
  154.  
  155. FUNCTION FileOpenDialog(Win:HWND;VAR result:String):Boolean;
  156. VAR Dlg:FileDlg;
  157. BEGIN
  158.      fillchar(dlg,sizeof(FileDlg),0); {Clear Dialog structure}
  159.      ASM
  160.         LEA EDI,$dlg
  161.         ADD EDI,20   ;to pszTitle
  162.         MOV EAX,OFFSET(_FileOpenDlgTitle)
  163.         INC EAX
  164.         MOV [EDI+0],EAX
  165.  
  166.         LEA EDI,$dlg
  167.         ADD EDI,24  ;to pszOKButton
  168.         MOV EAX,OFFSET(_FileOpenDlgOkName)
  169.         INC EAX
  170.         MOV [EDI+0],EAX
  171.  
  172.         LEA EDI,$dlg
  173.         ADD EDI,52  ;to szFullFile
  174.         MOV ESI,OFFSET(_FileOpenDlgWildCards)
  175.         MOV CL,[ESI+0]
  176.         INC ESI
  177.         MOVZX ECX,CL
  178.         INC ECX
  179.         CLD
  180.         REP
  181.         MOVSB
  182.      END;
  183.      dlg.cbSize:=sizeof(Filedlg);
  184.      dlg.fl:=$901;  {FDS_OPEN_DIALOG | FDS_CENTER | FDS_ENABLEFILELB }
  185.      ASM
  186.         LEA EAX,$Dlg
  187.         PUSH EAX
  188.         PUSHL $Win
  189.         PUSHL 1   ;Owner is HWND_DESKTOP
  190.         MOV AL,3
  191.         CALLDLL PMCTLS,4  ;WinFileDlg
  192.         ADD ESP,12
  193.      END;
  194.      IF Dlg.lReturn=1 THEN {DID_OK}
  195.      BEGIN
  196.           asm
  197.              MOV EDI,$result
  198.              INC EDI
  199.              LEA ESI,$dlg
  200.              ADD ESI,52  ;to szFullFile
  201.              MOV CX,0
  202. !next:
  203.              MOV AL,[ESI+0]
  204.              CMP AL,0
  205.              JE !ec
  206.              MOV [EDI+0],AL
  207.              INC EDI
  208.              INC ESI
  209.              INC CX
  210.              JMP !next
  211. !ec:
  212.              MOV EDI,$result
  213.              MOV [EDI+0],CL  ;set length
  214.           end;
  215.           FileOpenDialog:=TRUE;
  216.      END
  217.      ELSE
  218.      BEGIN
  219.           result:='';
  220.           FileOpenDialog:=FALSE;
  221.      END;
  222. END;
  223.  
  224. FUNCTION FileSaveDialog(Win:HWND;VAR result:String):Boolean;
  225. VAR Dlg:FileDlg;
  226.     t:BYTE;
  227. BEGIN
  228.      fillchar(dlg,sizeof(FileDlg),0); {Clear Dialog structure}
  229.      asm
  230.         LEA EDI,$dlg
  231.         ADD EDI,20   ;to pszTitle
  232.         MOV EAX,OFFSET(_FileSaveDlgTitle)
  233.         INC EAX
  234.         MOV [EDI+0],EAX
  235.  
  236.         LEA EDI,$dlg
  237.         ADD EDI,24  ;to pszOKButton
  238.         mOV EAX,OFFSET(_FileSaveDlgOkName)
  239.         INC EAX
  240.         MOV [EDI+0],EAX
  241.  
  242.         LEA EDI,$dlg
  243.         ADD EDI,52  ;to szFullFile
  244.         MOV ESI,OFFSET(_FileSaveDlgWildCards)
  245.         MOV CL,[ESI+0]
  246.         INC ESI
  247.         MOVZX ECX,CL
  248.         INC ECX
  249.         CLD
  250.         REP
  251.         MOVSB
  252.      end;
  253.      Dlg.cbSize:=sizeof(Filedlg);
  254.      Dlg.fl:=$a01;  {FDS_SAVEAS_DIALOG | FDS_CENTER | FDS_ENABLEFILELB }
  255.      asm
  256.         LEA EAX,$Dlg
  257.         PUSH EAX
  258.         PUSHL $Win
  259.         PUSHL 1   ;Owner is HWND_DESKTOP
  260.         MOV AL,3
  261.         CALLDLL PMCTLS,4  ;WinFileDlg
  262.         ADD ESP,12
  263.      end;
  264.      IF Dlg.lReturn=1 THEN {DID_OK}
  265.      BEGIN
  266.           asm
  267.              MOV EDI,$result
  268.              INC EDI
  269.              LEA ESI,$dlg
  270.              ADD ESI,52  ;to szFullFile
  271.              MOV CX,0
  272. !next_1:
  273.              MOV AL,[ESI+0]
  274.              CMP AL,0
  275.              JE !ec_1
  276.              MOV [EDI+0],AL
  277.              INC EDI
  278.              INC ESI
  279.              INC CX
  280.              JMP !next_1
  281. !ec_1:
  282.              MOV EDI,$result
  283.              MOV [EDI+0],CL  ;set length
  284.           end;
  285.           FileSaveDialog:=TRUE;
  286.      END
  287.      ELSE
  288.      BEGIN
  289.           result:='';
  290.           FileSaveDialog:=FALSE;
  291.      END;
  292.      FOR t:=1 TO length(result) DO result[t]:=upcase(result[t]);
  293. END;
  294.  
  295.  
  296. BEGIN
  297.      FileOpenDlgTitle:='Open a file';
  298.      FileOpenDlgWildcards:='*.*';
  299.      FileOpenDlgOkname:='Open';
  300.      FileSaveDlgTitle:='Save file as';
  301.      FileSaveDlgWildcards:='*.*';
  302.      FileSaveDlgOkname:='Save';
  303. END.