home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
spdos2.zip
/
LIBSRC
/
PMDIALOG.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1994-06-21
|
9KB
|
303 lines
UNIT PMDialog;
{**************************************************************************
* *
* *
* *
* General Unit for Object-PM (C) 1993,94 R. Nürnberger *
* *
* *
***************************************************************************}
INTERFACE
USES PMObject;
TYPE TDialog=OBJECT
HwndDlg:Hwnd;
{*******Do not change this location -- its hard coded***}
FUNCTION DialogHandleEvent(Dlg:HWND;msg:LONGWORD;
Para1,Para2:LONGWORD;VAR Handled:BOOLEAN):
LONGWORD;
{*******************************************************}
CONSTRUCTOR Init(Parent,Owner:HWND;hmod:HModule;idDlg:LONGWORD;
pCreateParams:Pointer);
DESTRUCTOR Done;
PROCEDURE ExecDialog;
PROCEDURE GetDlg(VAR Dlg:HWND);
END;
VAR FileOpenDlgWildCards:STRING;
FileOpenDlgTitle:String[40];
FileOpenDlgOkName:String[40];
FileSaveDlgWildCards:STRING;
FileSaveDlgTitle:String[40];
FileSaveDlgOkName:String[40];
DialogVMT:POINTER;
FUNCTION FileOpenDialog(Win:HWND;Wildcards:String;VAR result:String):Boolean;
FUNCTION FileSaveDialog(Win:HWND;Wildcards:String;VAR result:String):Boolean;
IMPLEMENTATION
IMPORTS {Private}
FUNCTION WinLoadDlg(pCreateParams:POINTER;idDld:LONGWORD;
hmod:HMODULE;DlgProc:POINTER;Owner:HWND;
Parent:HWND):LONGWORD: PMWIN index 924;
FUNCTION WinProcessDlg(hwndDlg:HWND):LONGWORD: PMWIN index 796;
FUNCTION WinDefDlgProc(Para2,Para1:POINTER;msg:LONGWORD;hwnddlg:HWND):
LONGWORD: PMWIn index 910;
FUNCTION WinDestroyWindow(_hwnd:HWND):
LONGWORD: PMWIN index 728;
END;
PROCEDURE TDialog.GetDlg(VAR Dlg:HWND);
BEGIN
Dlg:=hwnddlg;
END;
FUNCTION TDialog.DialogHandleEvent(Dlg:HWND;msg:LONGWORD;Para1,Para2:
LONGWORD;VAR Handled:BOOLEAN):LONGWORD;
VAR H:BOOLEAN;
r:LONGWORD;
BEGIN
r:=0;
H:=FALSE;
Handled:=H;
DialogHandleEvent:=r;
END;
PROCEDURE StdDlgProc(para2,para1:POINTER;Msg,Win:LONGWORD);ASM;
BEGIN
ASM
PUSH EBP
MOV EBP,ESP
SUB ESP,2
MOVW [EBP-2],0 ;Not Handled
PUSHL $Win
PUSHL $Msg
PUSHL $para1
PUSHL $para2
LEA EAX,[EBP-2] ;Handled
PUSH EAX
MOV EDI,_DialogVMT
PUSH EDI ;VMT Pointer
MOV EDI,[EDI+0] ;get VMT pointer for AppHandleEvent
db ffh,17h ;CALL NEAR32 [EDI+0] --> in Methode springen
MOV BL,[EBP-2]
CMP BL,0
JNE !hh
;not handled
;Default Dialog handler
PUSHL $para2
PUSHL $para1
PUSHL $msg
PUSHL $win
MOV AL,4
CALLDLL PMWin,910 ;WinDefDlgProc
ADD ESP,16
!hh:
LEAVE
RETN32
END;
END;
CONSTRUCTOR TDialog.Init(Parent,Owner:HWND;hmod:HModule;idDlg:LONGWORD;
PCreateParams:Pointer);
BEGIN
DialogVMT:=SELF;
hwnddlg:=WinLoadDlg(PCreateParams,idDlg,hmod,@StdDlgProc,Owner,Parent);
END;
DESTRUCTOR TDialog.Done;
BEGIN
END;
PROCEDURE TDialog.ExecDialog;
BEGIN
WinProcessDlg(hwnddlg);
WinDestroyWindow(hwnddlg);
END;
TYPE PFileDlg=^FileDlg;
FileDlg=record
cbSize:LONGWORD; { Size of FILEDLG structure.}
fl:LONGWORD; { FDS_ flags. Alter behavior of dlg. }
ulUser:LONGWORD; { User defined field. }
lReturn:LONGWORD; { Result code from dialog dismissal. }
lSRC:LONGWORD; { System return code. }
pszTitle:POINTER; { String to display in title bar.}
pszOKButton:POINTER; { String to display in OK button. }
pfnDlgProc:POINTER; { Entry point to custom dialog proc. }
pszIType:POINTER; { Pointer to string }
papszITypeList:POINTER;
pszIDrive:POINTER;
papszIDriveList:POINTER;
hMod:LONGWORD; { Custom File Dialog template. }
szFullFile:ARRAY[0..259] OF Char;
papszFQFilename:POINTER;
ulFQFCount:LONGWORD; { Number of files selected }
usDlgId:WORD; { Custom dialog id.}
x:WORD; { X coordinate of the dialog }
y:WORD; { Y coordinate of the dialog }
sEAType:WORD; { Selected files EA Type. }
END;
FUNCTION FileOpenDialog(Win:HWND;VAR result:String):Boolean;
VAR Dlg:FileDlg;
BEGIN
fillchar(dlg,sizeof(FileDlg),0); {Clear Dialog structure}
ASM
LEA EDI,$dlg
ADD EDI,20 ;to pszTitle
MOV EAX,OFFSET(_FileOpenDlgTitle)
INC EAX
MOV [EDI+0],EAX
LEA EDI,$dlg
ADD EDI,24 ;to pszOKButton
MOV EAX,OFFSET(_FileOpenDlgOkName)
INC EAX
MOV [EDI+0],EAX
LEA EDI,$dlg
ADD EDI,52 ;to szFullFile
MOV ESI,OFFSET(_FileOpenDlgWildCards)
MOV CL,[ESI+0]
INC ESI
MOVZX ECX,CL
INC ECX
CLD
REP
MOVSB
END;
dlg.cbSize:=sizeof(Filedlg);
dlg.fl:=$901; {FDS_OPEN_DIALOG | FDS_CENTER | FDS_ENABLEFILELB }
ASM
LEA EAX,$Dlg
PUSH EAX
PUSHL $Win
PUSHL 1 ;Owner is HWND_DESKTOP
MOV AL,3
CALLDLL PMCTLS,4 ;WinFileDlg
ADD ESP,12
END;
IF Dlg.lReturn=1 THEN {DID_OK}
BEGIN
asm
MOV EDI,$result
INC EDI
LEA ESI,$dlg
ADD ESI,52 ;to szFullFile
MOV CX,0
!next:
MOV AL,[ESI+0]
CMP AL,0
JE !ec
MOV [EDI+0],AL
INC EDI
INC ESI
INC CX
JMP !next
!ec:
MOV EDI,$result
MOV [EDI+0],CL ;set length
end;
FileOpenDialog:=TRUE;
END
ELSE
BEGIN
result:='';
FileOpenDialog:=FALSE;
END;
END;
FUNCTION FileSaveDialog(Win:HWND;VAR result:String):Boolean;
VAR Dlg:FileDlg;
t:BYTE;
BEGIN
fillchar(dlg,sizeof(FileDlg),0); {Clear Dialog structure}
asm
LEA EDI,$dlg
ADD EDI,20 ;to pszTitle
MOV EAX,OFFSET(_FileSaveDlgTitle)
INC EAX
MOV [EDI+0],EAX
LEA EDI,$dlg
ADD EDI,24 ;to pszOKButton
mOV EAX,OFFSET(_FileSaveDlgOkName)
INC EAX
MOV [EDI+0],EAX
LEA EDI,$dlg
ADD EDI,52 ;to szFullFile
MOV ESI,OFFSET(_FileSaveDlgWildCards)
MOV CL,[ESI+0]
INC ESI
MOVZX ECX,CL
INC ECX
CLD
REP
MOVSB
end;
Dlg.cbSize:=sizeof(Filedlg);
Dlg.fl:=$a01; {FDS_SAVEAS_DIALOG | FDS_CENTER | FDS_ENABLEFILELB }
asm
LEA EAX,$Dlg
PUSH EAX
PUSHL $Win
PUSHL 1 ;Owner is HWND_DESKTOP
MOV AL,3
CALLDLL PMCTLS,4 ;WinFileDlg
ADD ESP,12
end;
IF Dlg.lReturn=1 THEN {DID_OK}
BEGIN
asm
MOV EDI,$result
INC EDI
LEA ESI,$dlg
ADD ESI,52 ;to szFullFile
MOV CX,0
!next_1:
MOV AL,[ESI+0]
CMP AL,0
JE !ec_1
MOV [EDI+0],AL
INC EDI
INC ESI
INC CX
JMP !next_1
!ec_1:
MOV EDI,$result
MOV [EDI+0],CL ;set length
end;
FileSaveDialog:=TRUE;
END
ELSE
BEGIN
result:='';
FileSaveDialog:=FALSE;
END;
FOR t:=1 TO length(result) DO result[t]:=upcase(result[t]);
END;
BEGIN
FileOpenDlgTitle:='Open a file';
FileOpenDlgWildcards:='*.*';
FileOpenDlgOkname:='Open';
FileSaveDlgTitle:='Save file as';
FileSaveDlgWildcards:='*.*';
FileSaveDlgOkname:='Save';
END.