home *** CD-ROM | disk | FTP | other *** search
/ Mega Top 1 / os2_top1.zip / os2_top1 / APPS / PROG / PASCAL / SPEED2 / SRC / LIB / PMDIALOG.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1994-10-10  |  24.7 KB  |  922 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,PmTypes;
  16.  
  17.  
  18. TYPE PListBoxItems=^TListBoxItems;
  19.      TListBoxItems=RECORD
  20.                          item:String;
  21.                          _index:WORD;
  22.                          Data:POINTER; {Private data}
  23.                          cbData:LONGWORD; {Count of private data}
  24.                          Next:PListBoxItems;
  25.                    END;
  26.  
  27.  
  28. TYPE TDialog=OBJECT
  29.                    HwndDlg:Hwnd;
  30.                    {*******Do not change this location -- its hard coded***}
  31.                    FUNCTION DialogHandleEvent(Dlg:HWND;msg:LONGWORD;
  32.                                         Para1,Para2:LONGWORD;VAR Handled:BOOLEAN):
  33.                                         LONGWORD;VIRTUAL;
  34.                    {*******************************************************}
  35.                    CONSTRUCTOR Init(Parent,Owner:HWND;hmod:HModule;idDlg:LONGWORD;
  36.                                     pCreateParams:Pointer);
  37.                    DESTRUCTOR Done;
  38.                    PROCEDURE ExecDialog(VAR r:LONGWORD);VIRTUAL;
  39.                    PROCEDURE GetDlg(VAR Dlg:HWND);VIRTUAL;
  40.                    PROCEDURE CenterDlgBox(Dlg:HWND);VIRTUAL;
  41.                    PROCEDURE WMInitDlg(VAR Msg:TMessage);VIRTUAL WM_INITDLG;
  42.                    PROCEDURE WMControl(VAR Msg:TMessage);VIRTUAL WM_CONTROL;
  43.              END;
  44.  
  45.  
  46. VAR FileOpenDlgWildCards:STRING;
  47.     FileOpenDlgTitle:String[40];
  48.     FileOpenDlgOkName:String[40];
  49.     FileSaveDlgWildCards:STRING;
  50.     FileSaveDlgTitle:String[40];
  51.     FileSaveDlgOkName:String[40];
  52.     DialogVMT:POINTER;
  53.  
  54.  
  55. FUNCTION FileOpenDialog(Win:HWND;Wildcards:String;VAR result:String):Boolean;
  56. FUNCTION FileSaveDialog(Win:HWND;VAR result:String):Boolean;
  57.  
  58. FUNCTION ListBoxInsertString(Dlg:HWND;where:LONGINT;s:string):WORD;
  59. PROCEDURE FillListBox(Dlg:HWND;id:LONGWORD;List:PListBoxItems);
  60. PROCEDURE NewListBoxItem(VAR List:PListBoxItems;item:String;Data:POINTER;
  61.                          cbData:LONGWORD;Sort:BOOLEAN);
  62. PROCEDURE DialogGetText(Dlg:HWND;id:LONGWORD;VAR s:String;cb:BYTE);
  63. PROCEDURE DialogSetText(Dlg:HWND;id:LONGWORD;s:String);
  64. PROCEDURE ListBoxGetSelItem(Dlg:HWND;id:LONGWORD;VAR result:TListBoxItems;
  65.                             VAR List:PListBoxItems;Erase:BOOLEAN);
  66. PROCEDURE DeleteListBox(VAR List:PListBoxItems);
  67. PROCEDURE SetTextLimit(Dlg:HWND;id:LONGWORD;Limit:BYTE);
  68. PROCEDURE SetMenuText(Frame:HWND;Id:LONGWORD;s:string);
  69. PROCEDURE InsertSubMenu(Frame:HWND;MainMenuID:WORD;pos:INTEGER;id:WORD;s:STRING);
  70. PROCEDURE RemoveSubMenu(Frame:HWND;id:WORD);
  71. PROCEDURE RemoveSubMenuByPos(Frame:HWND;MainMenuID:WORD;pos:Integer);
  72. PROCEDURE SetCheckBoxState(Dlg:HWND;Id:LONGWORD;Setit:LONGWORD);
  73. FUNCTION GetCheckBoxState(Dlg:HWND;Id:LONGWORD):LONGWORD;
  74. FUNCTION GetRadioButtonState(Dlg:HWND;Id:LONGWORD):LONGWORD;
  75. PROCEDURE SetRadioButtonState(Dlg:HWND;Id:LONGWORD;Setit:LONGWORD);
  76.  
  77. IMPLEMENTATION
  78.  
  79. CONST
  80.      {List box notification messages}
  81.  
  82.      LN_SELECT                 =1;
  83.      LN_SETFOCUS               =2;
  84.      LN_KILLFOCUS              =3;
  85.      LN_SCROLL                 =4;
  86.      LN_ENTER                  =5;
  87.  
  88.      {Entry Field  messages}
  89.  
  90.      EM_QUERYCHANGED           =$0140;
  91.      EM_QUERYSEL               =$0141;
  92.      EM_SETSEL                 =$0142;
  93.      EM_SETTEXTLIMIT           =$0143;
  94.  
  95.  
  96.  
  97. CONST
  98.      {List box messages}
  99.      LM_QUERYITEMCOUNT         =$0160;
  100.      LM_INSERTITEM             =$0161;
  101.      LM_SETTOPINDEX            =$0162;
  102.      LM_DELETEITEM             =$0163;
  103.      LM_SELECTITEM             =$0164;
  104.      LM_QUERYSELECTION         =$0165;
  105.      LM_SETITEMTEXT            =$0166;
  106.      LM_QUERYITEMTEXTLENGTH    =$0167;
  107.      LM_QUERYITEMTEXT          =$0168;
  108.  
  109.      LM_SETITEMHANDLE          =$0169;
  110.      LM_QUERYITEMHANDLE        =$016a;
  111.      LM_SEARCHSTRING           =$016b;
  112.      LM_SETITEMHEIGHT          =$016c;
  113.      LM_QUERYTOPINDEX          =$016d;
  114.      LM_DELETEALL              =$016e;
  115.  
  116.      {List box constants}
  117.  
  118.  
  119.      LIT_CURSOR                =-4;
  120.      LIT_ERROR                 =-3;
  121.      LIT_MEMERROR              =-2;
  122.      LIT_NONE                  =-1;
  123.      LIT_FIRST                 =-1;
  124.  
  125.      {For LM_INSERTITEM msg}
  126.  
  127.      LIT_END                   =-1;
  128.      LIT_SORTASCENDING         =-2;
  129.      LIT_SORTDESCENDING        =-3;
  130.  
  131.      {Button control messages}
  132.  
  133.      BM_CLICK                  =$0120;
  134.      BM_QUERYCHECKINDEX        =$0121;
  135.      BM_QUERYHILITE            =$0122;
  136.      BM_SETHILITE              =$0123;
  137.      BM_QUERYCHECK             =$0124;
  138.      BM_SETCHECK               =$0125;
  139.      BM_SETDEFAULT             =$0126;
  140.  
  141. IMPORTS {Private}
  142.        FUNCTION WinLoadDlg(pCreateParams:POINTER;idDld:LONGWORD;
  143.                            hmod:HMODULE;DlgProc:POINTER;Owner:HWND;
  144.                            Parent:HWND):LONGWORD:   PMWIN index 924;
  145.        FUNCTION WinProcessDlg(hwndDlg:HWND):LONGWORD: PMWIN index 796;
  146.        FUNCTION WinDefDlgProc(Para2,Para1:POINTER;msg:LONGWORD;hwnddlg:HWND):
  147.                            LONGWORD:    PMWIn index 910;
  148.        FUNCTION WinDestroyWindow(_hwnd:HWND):
  149.                                     LONGWORD:                PMWIN index 728;
  150.        PROCEDURE WinQueryWindowText(VAR Buf;
  151.                                     cchBufferMax:LONGWORD;
  152.                                     _hwnd:HWND):             PMWIN index 841;
  153.        FUNCTION WinWindowFromID(id:LONGWORD;_hwnd:HWND):
  154.                                 HWND:                        PMWIN index 899;
  155.        PROCEDURE WinShowWindow(fShow:LONGWORD;_hwnd:HWND):   PMWIN index 883;
  156.        PROCEDURE WinEnableWindowUpdate(fEnable:LONGWORD;
  157.                                        _hwnd:HWND):          PMWIN index 736;
  158.        FUNCTION WinSendMsg(MPARAM2,MPARAM1:LONGWORD;
  159.                            msg:LONGWORD;
  160.                            _hwnd:HWND):LONGWORD:             PMWIN index 920;
  161.        PROCEDURE WinSetWindowText(pszText:POINTER;
  162.                                   _hwnd:HWND):               PMWIN index 877;
  163.        PROCEDURE WinDisMissDlg(result:LONGWORD;Dlg:HWND):    PMWIN index 729;
  164.        FUNCTION WinSendDlgItemMsg(para2,para1:LONGWORD;
  165.                                   msg,id:LONGWORD;
  166.                                   Dlg:HWND):LONGWORD:        PMWIN index 903;
  167.        FUNCTION WinQueryWindowPos(_swp:SWP;
  168.                                    _hwnd:HWND):LONGWORD:     PMWIN index 837;
  169.        FUNCTION WinSetWindowPos(fl:LONGWORD;
  170.                                  cy,cx,y,x:LONGWORD;
  171.                                  hwndInsertBehind:HWND;
  172.                                  _hwnd:HWND):LONGWORD:       PMWIN index 875;
  173.        FUNCTION WinQueryWindow(cmd:LONGWORD;
  174.                                _hwnd:HWND):LONGWORD:            PMWIN index 834;
  175. END;
  176.  
  177.  
  178. {***************************************************************************
  179. *                                                                          *
  180. *                 Common functions                                         *
  181. *                                                                          *
  182. ****************************************************************************}
  183.  
  184. FUNCTION GetCheckBoxState(Dlg:HWND;Id:LONGWORD):LONGWORD;
  185. BEGIN
  186.      GetCheckBoxState:=WinSendDlgItemMsg(0,0,BM_QUERYCHECK,id,Dlg);
  187.  END;
  188.  
  189. PROCEDURE SetCheckBoxState(Dlg:HWND;Id:LONGWORD;Setit:LONGWORD);
  190. VAR
  191.    para1:LONGWORD;
  192. BEGIN
  193.      IF Setit<>0 THEN Para1:=1
  194.      ELSE Para1:=0;
  195.      WinSendDlgItemMsg(0,para1,BM_SETCHECK,id,Dlg);
  196. END;
  197.  
  198. FUNCTION GetRadioButtonState(Dlg:HWND;Id:LONGWORD):LONGWORD;
  199. BEGIN
  200.      GetRadioButtonState:=WinSendDlgItemMsg(0,0,BM_QUERYCHECK,id,Dlg);
  201. END;
  202.  
  203. PROCEDURE SetRadioButtonState(Dlg:HWND;Id:LONGWORD;Setit:LONGWORD);
  204. VAR
  205.    para1:LONGWORD;
  206. BEGIN
  207.      IF Setit<>0 THEN Para1:=1
  208.      ELSE Para1:=0;
  209.      WinSendDlgItemMsg(0,para1,BM_SETCHECK,id,Dlg);
  210. END;
  211.  
  212. PROCEDURE SetMenuText(Frame:HWND;Id:LONGWORD;s:string);
  213. VAR HwndMenu:HWND;
  214.     p:POINTER;
  215. BEGIN
  216.      HwndMenu:=WinWindowFromID($8005{FID_MENU},Frame);
  217.      IF HwndMenu=0 THEN exit;
  218.      p:=@s;
  219.      inc(p);
  220.      WinSendMsg(LONGWORD(p),id,$018e{MM_SETITEMTEXT},HwndMenu);
  221. END;
  222.  
  223. PROCEDURE RemoveSubMenuByPos(Frame:HWND;MainMenuID:WORD;pos:Integer);
  224. VAR HwndMenu:HWND;
  225.     p,p1,p2:POINTER;
  226.     mi:RECORD
  227.              iPosition:INTEGER;
  228.              afStyle:WORD;
  229.              afAttribute:WORD;
  230.              id:WORD;
  231.              hwndSubMenu:HWND;
  232.              hItem:LONGWORD;
  233.        END;
  234.     Menu:HWND;
  235. BEGIN
  236.     HwndMenu:=WinWindowFromID($8005{FID_MENU},Frame);
  237.     IF HwndMenu=0 THEN exit;
  238.     p1:=@mi;
  239.     p2:=MPFROM2SHORT(MainMenuID,1);
  240.     IF WinSendMsg(LONGWORD(p1),LONGWORD(p2),$0182{MM_QUERYITEM},HwndMenu)=0
  241.       THEN exit;
  242.     Menu:=mi.hwndSubMenu;
  243.     WinSendMsg(0,pos,$01f1{MM_DELETEITEMBYPOS},Menu);
  244. END;
  245.  
  246. PROCEDURE InsertSubMenu(Frame:HWND;MainMenuID:WORD;pos:INTEGER;id:WORD;
  247.                         s:STRING);
  248. VAR HwndMenu:HWND;
  249.     p,p1,p2:POINTER;
  250.     mi:RECORD
  251.              iPosition:INTEGER;
  252.              afStyle:WORD;
  253.              afAttribute:WORD;
  254.              id:WORD;
  255.              hwndSubMenu:HWND;
  256.              hItem:LONGWORD;
  257.        END;
  258.     Menu:HWND;
  259. BEGIN
  260.     HwndMenu:=WinWindowFromID($8005{FID_MENU},Frame);
  261.     IF HwndMenu=0 THEN exit;
  262.     p:=@s;
  263.     inc(p);
  264.     p1:=@mi;
  265.     p2:=MPFROM2SHORT(MainMenuID,1);
  266.     IF WinSendMsg(LONGWORD(p1),LONGWORD(p2),$0182{MM_QUERYITEM},HwndMenu)=0
  267.       THEN exit;
  268.     Menu:=mi.hwndSubMenu;
  269.     IF Menu=0 THEN exit;
  270.     mi.iPosition:=pos;
  271.     IF id=65535 THEN mi.afStyle:=4  {MIS_SEPARATOR}
  272.     ELSE mi.afStyle:=1;  {MIS_TEXT}
  273.     mi.afAttribute:=0;
  274.     mi.id:=id;
  275.     mi.hwndSubMenu:=0;
  276.     mi.hitem:=0;
  277.     p1:=@mi;
  278.     WinSendMsg(LONGWORD(p),LONGWORD(p1),$0180{MM_INSERTITEM},Menu);
  279. END;
  280.  
  281. PROCEDURE RemoveSubMenu(Frame:HWND;id:WORD);
  282. VAR HwndMenu:HWND;
  283.     p:POINTER;
  284. BEGIN
  285.     HwndMenu:=WinWindowFromID($8005{FID_MENU},Frame);
  286.     IF HwndMenu=0 THEN exit;
  287.     p:=MPFROM2SHORT(id,1);
  288.     WinSendMsg(0,LONGWORD(p),$0181{MM_DELETEITEM},hwndMenu);
  289. END;
  290.  
  291.  
  292. PROCEDURE DeleteListBox(VAR List:PListBoxItems);
  293. VAR
  294.    Help:PListBoxItems;
  295. BEGIN
  296.      WHILE List<>NIL DO
  297.      BEGIN
  298.           Help:=List^.Next;
  299.           IF List^.cbData<>0 THEN IF List^.Data<>NIL THEN
  300.            FreeMem(List^.Data,List^.cbData);
  301.           Dispose(List);
  302.           List:=Help;
  303.      END;
  304. END;
  305.  
  306. PROCEDURE ListBoxGetSelItem(Dlg:HWND;id:LONGWORD;VAR result:TListBoxItems;
  307.                             VAR List:PListBoxItems;Erase:BOOLEAN);
  308. VAR HwndElement:HWND;
  309.     _index:WORD;
  310.     Help,HList:PListBoxItems;
  311.     pbSource,pbDest:^Byte;
  312. Label l;
  313. BEGIN
  314.      HwndElement:=WinWindowFromID(id,Dlg);
  315.      _index:=WinSendMsg(0,LIT_FIRST,LM_QUERYSELECTION,HwndElement);
  316.      Result.Item:='';
  317.      Result._index:=65535;
  318.      HList:=List;
  319.      WHILE HList<>NIL DO
  320.      BEGIN
  321.           IF HList^._index=_Index THEN
  322.           BEGIN
  323.                Result:=HList^;
  324.                IF result.cbData>0 THEN if result.Data<>NIL THEN
  325.                BEGIN
  326.                     GetMem(result.Data,result.cbData);
  327.                     pbsource:=HList^.Data;
  328.                     pbDest:=result.Data;
  329.                     move(pbSource^,pbDest^,result.cbData);
  330.                END;
  331.                goto l;
  332.           END;
  333.           HList:=HList^.Next;
  334.      END;
  335. l:
  336.      Result.Next:=NIL;
  337.      IF Erase THEN DeleteListBox(List);
  338. END;
  339.  
  340. PROCEDURE NewListBoxItem(VAR List:PListBoxItems;item:String;Data:POINTER;
  341.                          cbData:LONGWORD;Sort:BOOLEAN);
  342. VAR dummy:PListBoxItems;
  343.     Prev:PListBoxItems;
  344. LABEL l,l1;
  345. BEGIN
  346.      IF List=NIL THEN
  347.      BEGIN
  348.           New(List);
  349.           dummy:=List;
  350.           dummy^.Next:=NIL;
  351.      END
  352.      ELSE
  353.      BEGIN
  354.           IF Sort THEN
  355.           BEGIN
  356.                dummy:=List;
  357.                Prev:=NIL;
  358.                WHILE dummy<>NIL DO
  359.                BEGIN
  360.                     IF dummy^.Item>Item THEN goto l;
  361.                     Prev:=dummy;
  362.                     dummy:=dummy^.Next;
  363.                END;
  364.                {No Item found --> Append at end of List}
  365.                New(Prev^.Next);
  366.                dummy:=Prev^.Next;
  367.                dummy^.Next:=NIL;
  368.                goto l1;
  369. l:
  370.                {Insert the item at this position}
  371.                IF Prev=NIL THEN {At start of the list}
  372.                BEGIN
  373.                     dummy:=List;
  374.                     New(List);
  375.                     List^.Next:=dummy;
  376.                     dummy:=List;
  377.                END
  378.                ELSE {at position after Prev}
  379.                BEGIN
  380.                     dummy:=Prev^.Next;
  381.                     New(Prev^.Next);
  382.                     Prev:=Prev^.Next;
  383.                     Prev^.Next:=dummy;
  384.                     dummy:=Prev;
  385.                END;
  386.           END
  387.           ELSE
  388.           BEGIN
  389.                dummy:=List;
  390.                WHILE dummy^.Next<>NIL do dummy:=dummy^.Next;
  391.                New(dummy^.Next);
  392.                dummy:=dummy^.Next;
  393.                dummy^.Next:=NIL;
  394.           END;
  395.      END;
  396. l1:
  397.      dummy^.item:=item;
  398.      dummy^._index:=0;
  399.      dummy^.Data:=Data;
  400.      dummy^.cbData:=cbData;
  401. END;
  402.  
  403. FUNCTION ListBoxInsertString(Dlg:HWND;where:LONGINT;
  404.                              s:string):WORD;
  405. VAR
  406.     p:POINTER;
  407.     _index:WORD;
  408. BEGIN
  409.      p:=@s;
  410.      inc(p);
  411.      _index:=WinSendMsg(LONGWORD(p),where,LM_INSERTITEM,Dlg);
  412.      ListBoxInsertString:=_Index;
  413. END;
  414.  
  415. PROCEDURE FillListBox(Dlg:HWND;id:LONGWORD;List:PListBoxItems);
  416. VAR
  417.    HwndElement:HWND;
  418.    p:POINTER;
  419.    s:String;
  420. BEGIN
  421.      HwndElement:=WinWindowFromID(id,Dlg);
  422.      WinEnableWindowUpdate(0,hwndElement);
  423.  
  424.      WHILE List<>NIL DO
  425.      BEGIN
  426.           List^._Index:=ListBoxInsertString(HwndElement,LIT_END,
  427.                                             List^.item);
  428.           List:=List^.Next;
  429.      END;
  430.      WinShowWindow(1,HwndElement);
  431. END;
  432.  
  433. PROCEDURE DialogSetText(Dlg:HWND;id:LONGWORD;s:String);
  434. VAR
  435.     HwndElement:HWND;
  436.     t:BYTE;
  437.     p:POINTER;
  438. BEGIN
  439.      HwndElement:=WinWindowFromID(id,Dlg);
  440.      p:=@s;
  441.      Inc(p);
  442.      WinSetWindowText(p,HwndElement);
  443. END;
  444.  
  445. PROCEDURE DialogGetText(Dlg:HWND;id:LONGWORD;VAR s:String;cb:BYTE);
  446. VAR
  447.     HwndElement:HWND;
  448.     t:BYTE;
  449. BEGIN
  450.      HwndElement:=WinWindowFromID(id,Dlg);
  451.      WinQueryWindowText(s[1],cb,HwndElement);
  452.      FOR t:=1 TO cb-1 DO IF s[t]=#0 THEN
  453.      BEGIN
  454.           s[0]:=chr(t-1);
  455.           WHILE s[length(s)]=#32 do dec(s[0]);
  456.           exit;
  457.      END;
  458.      s[0]:=#0;
  459. END;
  460.  
  461. PROCEDURE SetTextLimit(Dlg:HWND;id:LONGWORD;Limit:BYTE);
  462. VAR
  463.    HwndElement:HWND;
  464. BEGIN
  465.      HwndElement:=WinWindowFromID(id,Dlg);
  466.      WinSendMsg(0,Limit,EM_SETTEXTLIMIT,HwndElement);
  467. END;
  468.  
  469. {***************************************************************************
  470. *                                                                          *
  471. *            Methods for TDIALOG                                           *
  472. *                                                                          *
  473. ****************************************************************************}
  474.  
  475. PROCEDURE TDialog.GetDlg(VAR Dlg:HWND);
  476. BEGIN
  477.      Dlg:=hwnddlg;
  478. END;
  479.  
  480. PROCEDURE TDialog.CenterDlgBox(Dlg:HWND);
  481. VAR
  482.    swpParent:SWP;
  483.    swpDialog:SWP;
  484.    xDiv,yDiv,xdiv1,ydiv1:LONGWORD;
  485.    DlgParent:HWND;
  486. BEGIN
  487.      DlgParent:=WinQueryWindow(QW_PARENT,Dlg);
  488.      WinQueryWindowPos (swpParent,DlgParent);
  489.      WinQueryWindowPos (swpDialog,Dlg);
  490.      xDiv:=swpParent.cx DIV 2;
  491.      yDiv:=swpParent.cy DIV 2;
  492.      xdiv1:=swpDialog.cx DIV 2;
  493.      ydiv1:=swpDialog.cy DIV 2;
  494.      IF xdiv>xdiv1 THEN
  495.       swpDialog.x:=xdiv-xdiv1;
  496.      IF ydiv>ydiv1 THEN
  497.       swpDialog.y:=ydiv-ydiv1;
  498.      WinSetWindowPos (swpDialog.fl OR SWP_ACTIVATE,swpDialog.cy,
  499.                       swpDialog.cx,swpDialog.y,
  500.                       swpDialog.x,swpDialog.HwndInsertBehind,Dlg);
  501. END;
  502.  
  503. PROCEDURE TDialog.WMInitDlg(VAR Msg:TMessage);
  504. BEGIN
  505.      CenterDlgBox(Msg.Win);
  506.      Msg.Result:=1; {!!!} {Dont remove this - Radiobuttons wont work}
  507. END;
  508.  
  509. PROCEDURE TDialog.WMControl(VAR Msg:TMessage);
  510. BEGIN
  511. END;
  512.  
  513.  
  514. FUNCTION TDialog.DialogHandleEvent(Dlg:HWND;msg:LONGWORD;Para1,Para2:
  515.                              LONGWORD;VAR Handled:BOOLEAN):LONGWORD;
  516. VAR H:BOOLEAN;
  517.     r:LONGWORD;
  518.     DmtFound:BOOLEAN;
  519.     _Msg:TMessage;
  520. BEGIN
  521.      r:=0;
  522.      H:=FALSE;  {not handled}
  523.      _Msg.Win:=Dlg;
  524.      _Msg.Para1:=LONGWORD(Para1);
  525.      _Msg.Para2:=LONGWORD(Para2);
  526.      _Msg.Message:=Msg;
  527.      _Msg.Handled:=TRUE;
  528.      _msg.Result:=0;
  529.      DMTFound:=FALSE;
  530.      {Check for dynamic methods}
  531.      ASM
  532.         MOV EDI,$!SELF
  533.         MOV EDI,[EDI+4]   ;DMT table address
  534.         MOV ECX,[EDI+0]   ;DMT table size
  535.         SHR ECX,3         ;Divide by 8
  536.         CMP ECX,0
  537.         JE !NoDMT         ;no dynamic methods
  538.         ADD EDI,4         ;onto first DMT entry
  539.         MOV EAX,$Msg
  540. !DMTLoop:
  541.         CMP EAX,[EDI+0]
  542.         JE !DMTHere       ;Message found
  543.         ADD EDI,8         ;next DMT entry
  544.         LOOP !DMTLoop
  545.         JMP !NoDMT
  546. !DMTHere:
  547.         MOVB $DMTFound,1
  548.         LEA EAX,$_Msg
  549.         PUSH EAX          ;Parameter for dynamic method call
  550.         MOV EAX,[EDI+4]   ;Method index in VMT
  551.         DEC EAX
  552.         SHL EAX,2         ;multiply with 4
  553.         MOV EDI,$!SELF
  554.         PUSH EDI          ;VMT for dynamic method
  555.         MOV EDI,[EDI+0]   ;Get VMT address
  556.         ADD EDI,EAX       ;Calculate method
  557.         db ffh,17h       ;CALL NEAR32 [EDI+0] --> in Methode springen
  558. !NoDMT:
  559.       END;
  560.       IF DMTFound THEN
  561.       BEGIN
  562.            H:=_Msg.Handled;
  563.            r:=_Msg.Result;
  564.      END;
  565.      Handled:=H;
  566.      DialogHandleEvent:=r;
  567. END;
  568.  
  569.  
  570. PROCEDURE StdDlgProc(para2,para1:POINTER;Msg,Win:LONGWORD);ASM;
  571. BEGIN
  572.      ASM
  573.         PUSH EBP
  574.  
  575.         MOV EBP,ESP
  576.         SUB ESP,2
  577.         ;Save parameters as it is SYSTEM Calling Convention
  578.         PUSH EDI
  579.         PUSH ESI
  580.         PUSH EBX
  581.  
  582.         MOVW [EBP-2],0   ;Not Handled
  583.         PUSHL $Win
  584.         PUSHL $Msg
  585.         PUSHL $para1
  586.         PUSHL $para2
  587.         LEA EAX,[EBP-2]  ;Handled
  588.         PUSH EAX
  589.         MOV EDI,_DialogVMT
  590.         PUSH EDI         ;VMT Pointer
  591.         MOV EDI,[EDI+0]  ;get VMT pointer for AppHandleEvent
  592.         db ffh,17h       ;CALL NEAR32 [EDI+0] --> Jump into method
  593.  
  594.         MOV BL,[EBP-2]
  595.         CMP BL,0
  596.         JNE !hh
  597.  
  598.         ;not handled -> Call default Dialog handler
  599.         PUSHL $para2
  600.         PUSHL $para1
  601.         PUSHL $msg
  602.         PUSHL $win
  603.         MOV AL,4
  604.         CALLDLL PMWin,910   ;WinDefDlgProc
  605.         ADD ESP,16
  606. !hh:
  607.         ;Get registers as it is SYSTEM calling convention
  608.         POP EBX
  609.         POP ESI
  610.         POP EDI
  611.         LEAVE
  612.         RETN32
  613.      END;
  614. END;
  615.  
  616. CONSTRUCTOR TDialog.Init(Parent,Owner:HWND;hmod:HModule;idDlg:LONGWORD;
  617.                          PCreateParams:Pointer);
  618. BEGIN
  619.      DialogVMT:=SELF;
  620.      hwnddlg:=0;
  621.      hwnddlg:=WinLoadDlg(PCreateParams,idDlg,hmod,@StdDlgProc,Owner,Parent);
  622. END;
  623.  
  624. DESTRUCTOR TDialog.Done;
  625. BEGIN
  626. END;
  627.  
  628. PROCEDURE TDialog.ExecDialog(VAR r:LONGWORD);
  629. BEGIN
  630.      r:=WinProcessDlg(hwnddlg);
  631.      WinDestroyWindow(hwnddlg);
  632. END;
  633.  
  634.  
  635. TYPE PFileDlg=^FileDlg;
  636.      FileDlg=record
  637.                    cbSize:LONGWORD;        { Size of FILEDLG structure.}
  638.                    fl:LONGWORD;            { FDS_ flags. Alter behavior of dlg. }
  639.                    ulUser:LONGWORD;        { User defined field. }
  640.                    lReturn:LONGWORD;       { Result code from dialog dismissal. }
  641.                    lSRC:LONGWORD;          { System return code. }
  642.                    pszTitle:POINTER;       { String to display in title bar.}
  643.                    pszOKButton:POINTER;    { String to display in OK button. }
  644.                    pfnDlgProc:POINTER;     { Entry point to custom dialog proc. }
  645.                    pszIType:POINTER;       { Pointer to string }
  646.                    papszITypeList:POINTER;
  647.                    pszIDrive:POINTER;
  648.                    papszIDriveList:POINTER;
  649.                    hMod:LONGWORD;   { Custom File Dialog template.       }
  650.                    szFullFile:ARRAY[0..259] OF Char;
  651.                    papszFQFilename:POINTER;
  652.                    ulFQFCount:LONGWORD;  { Number of files selected }
  653.                    usDlgId:WORD;         { Custom dialog id.}
  654.                    x:WORD;               { X coordinate of the dialog  }
  655.                    y:WORD;               { Y coordinate of the dialog  }
  656.                    sEAType:WORD;         { Selected files EA Type. }
  657.              END;
  658.  
  659. FUNCTION FileOpenDialog(Win:HWND;VAR result:String):Boolean;
  660. VAR Dlg:FileDlg;
  661.     t:BYTE;
  662. BEGIN
  663.      fillchar(dlg,sizeof(FileDlg),0); {Clear Dialog structure}
  664.      ASM
  665.         LEA EDI,$dlg
  666.         ADD EDI,20   ;to pszTitle
  667.         MOV EAX,OFFSET(_FileOpenDlgTitle)
  668.         INC EAX
  669.         MOV [EDI+0],EAX
  670.  
  671.         LEA EDI,$dlg
  672.         ADD EDI,24  ;to pszOKButton
  673.         MOV EAX,OFFSET(_FileOpenDlgOkName)
  674.         INC EAX
  675.         MOV [EDI+0],EAX
  676.  
  677.         LEA EDI,$dlg
  678.         ADD EDI,52  ;to szFullFile
  679.         MOV ESI,OFFSET(_FileOpenDlgWildCards)
  680.         MOV CL,[ESI+0]
  681.         INC ESI
  682.         MOVZX ECX,CL
  683.         INC ECX
  684.         CLD
  685.         REP
  686.         MOVSB
  687.      END;
  688.      dlg.cbSize:=sizeof(Filedlg);
  689.      dlg.fl:=$901;  {FDS_OPEN_DIALOG | FDS_CENTER | FDS_ENABLEFILELB }
  690.      ASM
  691.         LEA EAX,$Dlg
  692.         PUSH EAX
  693.         PUSHL $Win
  694.         PUSHL 1   ;Owner is HWND_DESKTOP
  695.         MOV AL,3
  696.         CALLDLL PMCTLS,4  ;WinFileDlg
  697.         ADD ESP,12
  698.      END;
  699.      IF Dlg.lReturn=1 THEN {DID_OK}
  700.      BEGIN
  701.           asm
  702.              MOV EDI,$result
  703.              INC EDI
  704.              LEA ESI,$dlg
  705.              ADD ESI,52  ;to szFullFile
  706.              MOV CX,0
  707. !next:
  708.              MOV AL,[ESI+0]
  709.              CMP AL,0
  710.              JE !ec
  711.              MOV [EDI+0],AL
  712.              INC EDI
  713.              INC ESI
  714.              INC CX
  715.              JMP !next
  716. !ec:
  717.              MOV EDI,$result
  718.              MOV [EDI+0],CL  ;set length
  719.           end;
  720.           FileOpenDialog:=TRUE;
  721.      END
  722.      ELSE
  723.      BEGIN
  724.           result:='';
  725.           FileOpenDialog:=FALSE;
  726.      END;
  727.      FOR t:=1 TO length(result) DO result[t]:=upcase(result[t]);
  728. END;
  729.  
  730. FUNCTION FileSaveDialog(Win:HWND;VAR result:String):Boolean;
  731. VAR Dlg:FileDlg;
  732.     t:BYTE;
  733. BEGIN
  734.      fillchar(dlg,sizeof(FileDlg),0); {Clear Dialog structure}
  735.      asm
  736.         LEA EDI,$dlg
  737.         ADD EDI,20   ;to pszTitle
  738.         MOV EAX,OFFSET(_FileSaveDlgTitle)
  739.         INC EAX
  740.         MOV [EDI+0],EAX
  741.  
  742.         LEA EDI,$dlg
  743.         ADD EDI,24  ;to pszOKButton
  744.         mOV EAX,OFFSET(_FileSaveDlgOkName)
  745.         INC EAX
  746.         MOV [EDI+0],EAX
  747.  
  748.         LEA EDI,$dlg
  749.         ADD EDI,52  ;to szFullFile
  750.         MOV ESI,OFFSET(_FileSaveDlgWildCards)
  751.         MOV CL,[ESI+0]
  752.         INC ESI
  753.         MOVZX ECX,CL
  754.         INC ECX
  755.         CLD
  756.         REP
  757.         MOVSB
  758.      end;
  759.      Dlg.cbSize:=sizeof(Filedlg);
  760.      Dlg.fl:=$a01;  {FDS_SAVEAS_DIALOG | FDS_CENTER | FDS_ENABLEFILELB }
  761.      asm
  762.         LEA EAX,$Dlg
  763.         PUSH EAX
  764.         PUSHL $Win
  765.         PUSHL 1   ;Owner is HWND_DESKTOP
  766.         MOV AL,3
  767.         CALLDLL PMCTLS,4  ;WinFileDlg
  768.         ADD ESP,12
  769.      end;
  770.      IF Dlg.lReturn=1 THEN {DID_OK}
  771.      BEGIN
  772.           asm
  773.              MOV EDI,$result
  774.              INC EDI
  775.              LEA ESI,$dlg
  776.              ADD ESI,52  ;to szFullFile
  777.              MOV CX,0
  778. !next_1:
  779.              MOV AL,[ESI+0]
  780.              CMP AL,0
  781.              JE !ec_1
  782.              MOV [EDI+0],AL
  783.              INC EDI
  784.              INC ESI
  785.              INC CX
  786.              JMP !next_1
  787. !ec_1:
  788.              MOV EDI,$result
  789.              MOV [EDI+0],CL  ;set length
  790.           end;
  791.           FileSaveDialog:=TRUE;
  792.      END
  793.      ELSE
  794.      BEGIN
  795.           result:='';
  796.           FileSaveDialog:=FALSE;
  797.      END;
  798.      FOR t:=1 TO length(result) DO result[t]:=upcase(result[t]);
  799. END;
  800.  
  801.  
  802. BEGIN
  803.      FileOpenDlgTitle:='Open a file';
  804.      FileOpenDlgWildcards:='*.*';
  805.      FileOpenDlgOkname:='Open';
  806.      FileSaveDlgTitle:='Save file as';
  807.      FileSaveDlgWildcards:='*.*';
  808.      FileSaveDlgOkname:='Save';
  809. END.
  810.  
  811.  
  812.  
  813.  
  814.  
  815.  
  816.  
  817.  
  818.  
  819.  
  820.  
  821.  
  822.  
  823.  
  824.  
  825.  
  826.  
  827.  
  828.  
  829.  
  830.  
  831.  
  832.  
  833.  
  834.  
  835.  
  836.  
  837.  
  838.  
  839.  
  840.  
  841.  
  842.  
  843.  
  844.  
  845.  
  846.  
  847.  
  848.  
  849.  
  850.  
  851.  
  852.  
  853.  
  854.  
  855.  
  856.  
  857.  
  858.  
  859.  
  860.  
  861.  
  862.  
  863.  
  864.  
  865.  
  866.  
  867.  
  868.  
  869.  
  870.  
  871.  
  872.  
  873.  
  874.  
  875.  
  876.  
  877.  
  878.  
  879.  
  880.  
  881.  
  882.  
  883.  
  884.  
  885.  
  886.  
  887.  
  888.  
  889.  
  890.  
  891.  
  892.  
  893.  
  894.  
  895.  
  896.  
  897.  
  898.  
  899.  
  900.  
  901.  
  902.  
  903.  
  904.  
  905.  
  906.  
  907.  
  908.  
  909.  
  910.  
  911.  
  912.  
  913.  
  914.  
  915.  
  916.  
  917.  
  918.  
  919.  
  920.  
  921.