edit.pp 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. {
  2. $Id$
  3. Copyright (c) 1999 by Michael van Canneyt and Goran Andersson
  4. Win32 editor example.
  5. }
  6. { Derived from menu.pp
  7. Changes by Goeran Andersson:
  8. 2000.02.20
  9. Sends focus to editor
  10. 2000.02.19
  11. Client edge added to editor
  12. Changes to also compile in FPC mode
  13. Handles Edit modify flag
  14. Undo menu item added
  15. Key codes added to edit menu
  16. Undo, Cut, Copy & Paste implemented
  17. WM_Paint sections commented
  18. 1999.08.10
  19. LoadText() added
  20. NewText() added
  21. File selector added
  22. Asks to save file
  23. Empty files works
  24. EditCreate styles corrected
  25. 2do:
  26. reduce flickering when resizing
  27. use the status bar for something
  28. }
  29. Program editdemo;
  30. {$APPTYPE GUI}
  31. {$MODE DELPHI}
  32. Uses Strings,Windows;
  33. Const AppName = 'EditDemo';
  34. Var AMessage: Msg;
  35. HWindow,HStatus,HEdit: HWnd;
  36. Type
  37. TFileName = Array[0..Max_Path] Of Char;
  38. Function SelectFile(Var FName:TFileName; Open:Boolean): Boolean;
  39. Const
  40. Filter: PChar = 'Text files (*.txt)'#0'*.txt'#0'All files (*.*)'#0'*.*'#0;
  41. Ext: PChar = 'txt';
  42. Var
  43. NameRec: OpenFileName;
  44. Begin
  45. FillChar(NameRec,SizeOf(NameRec),0);
  46. FName[0] := #0;
  47. With NameRec Do
  48. Begin
  49. LStructSize := SizeOf(NameRec);
  50. HWndOwner := HWindow;
  51. LpStrFilter := Filter;
  52. LpStrFile := @FName;
  53. NMaxFile := Max_Path;
  54. Flags := OFN_Explorer Or OFN_HideReadOnly;
  55. If Open Then
  56. Begin
  57. Flags := Flags Or OFN_FileMustExist;
  58. End;
  59. LpStrDefExt := Ext;
  60. End;
  61. If Open Then
  62. SelectFile := GetOpenFileName(@NameRec)
  63. Else
  64. SelectFile := GetSaveFileName(@NameRec);
  65. End;
  66. Procedure SaveText;
  67. Var Len: Longint;
  68. P: PChar;
  69. F: File;
  70. FName: TFileName;
  71. Begin
  72. If SelectFile(FName,False) Then
  73. Begin
  74. Assign(F,@FName);
  75. Rewrite(F,1);
  76. Len := GetWindowTextLength(HEdit);
  77. GetMem(P,Len+1);
  78. P[Len] := #0;
  79. If Len>0 Then
  80. Begin
  81. GetWindowText(HEdit,P,Len+1);
  82. BlockWrite(F,P^,Len);
  83. End;
  84. Close(F);
  85. FreeMem(P,Len+1);
  86. End;
  87. End;
  88. Procedure AskSave;
  89. Const
  90. BoxType=MB_IconQuestion Or MB_YesNo;
  91. Begin
  92. If SendMessage(HEdit,EM_GetModify,0,0)<>0 Then
  93. Begin
  94. If MessageBox(HWindow,'Save text?','Edited',BoxType)=IdYes Then
  95. Begin
  96. SaveText;
  97. End;
  98. End;
  99. End;
  100. Procedure LoadText;
  101. Var
  102. FName: TFileName;
  103. F: File;
  104. Len: LongInt;
  105. P: PChar;
  106. Begin
  107. AskSave;
  108. If SelectFile(FName,True) Then
  109. Begin
  110. Assign(F,@FName);
  111. Reset(F,1);
  112. Len := FileSize(F);
  113. GetMem(P,Len+1);
  114. P[Len] := #0;
  115. If Len>0 Then BlockRead(F,P^,Len);
  116. Close(F);
  117. SetWindowText(HEdit,P);
  118. SendMessage(HEdit,EM_SetModify,0,0);
  119. FreeMem(P,Len+1);
  120. End;
  121. End;
  122. Procedure NewText;
  123. Const
  124. Empty: PChar = '';
  125. Begin
  126. AskSave;
  127. SendMessage(HEdit,WM_SetText,1,LongInt(Empty));
  128. SendMessage(HEdit,EM_SetModify,0,0);
  129. End;
  130. Function WindowProc (Window:HWnd;AMessage,WParam,LParam:Longint): Longint;
  131. stdcall;
  132. export;
  133. Var
  134. R: rect;
  135. StatH: Word;
  136. NrMenu : Longint;
  137. // ps: paintstruct;
  138. Begin
  139. WindowProc := 0;
  140. Case AMessage Of
  141. {
  142. wm_Paint:
  143. Begin
  144. GetClientRect(Window,@R);
  145. BeginPaint(Window,@ps);
  146. ...
  147. EndPaint(Window,@ps);
  148. Exit;
  149. End;
  150. }
  151. wm_Close:
  152. Begin
  153. AskSave;
  154. End;
  155. wm_Destroy:
  156. Begin
  157. PostQuitMessage (0);
  158. Exit;
  159. End;
  160. wm_SetFocus:
  161. Begin
  162. SetFocus(HEdit);
  163. End;
  164. wm_Size:
  165. Begin
  166. GetClientRect(HStatus,@R);
  167. StatH := R.Bottom-R.Top;
  168. GetClientRect(Window,@R);
  169. MoveWindow (HEdit,0,0,R.Right,R.Bottom-StatH,False);
  170. MoveWindow (HStatus,0,R.Bottom-StatH,R.Right,R.Bottom,False);
  171. End;
  172. wm_Command:
  173. Begin
  174. NrMenu := LoWord(WParam);
  175. Case NrMenu Of
  176. 101 : NewText;
  177. 102 : LoadText;
  178. 103 : SaveText;
  179. 104 : PostMessage(Window,WM_Close,0,0);
  180. 201 : SendMessage(HEdit,WM_Undo,0,0);
  181. 202 : SendMessage(HEdit,WM_Cut,0,0);
  182. 203 : SendMessage(HEdit,WM_Copy,0,0);
  183. 204 : SendMessage(HEdit,WM_Paste,0,0);
  184. 301 : MessageBox(Window,'Options','Not implemented',
  185. MB_OK Or MB_IconInformation);
  186. 401 : MessageBox(Window,'Help','Not implemented',
  187. MB_OK Or MB_IconInformation);
  188. End;
  189. End;
  190. End;
  191. WindowProc := DefWindowProc(Window,AMessage,WParam,LParam);
  192. End;
  193. Function WinRegister: Boolean;
  194. Var
  195. WindowClass: WndClass;
  196. Begin
  197. With WindowClass Do
  198. Begin
  199. Style := cs_hRedraw Or cs_vRedraw;
  200. lpfnWndProc := WndProc(@WindowProc);
  201. cbClsExtra := 0;
  202. cbWndExtra := 0;
  203. hInstance := system.MainInstance;
  204. hIcon := LoadIcon (0,idi_Application);
  205. hCursor := LoadCursor (0,idc_Arrow);
  206. hbrBackground := GetStockObject(GRAY_BRUSH);
  207. lpszMenuName := 'Files';
  208. lpszClassName := AppName;
  209. End;
  210. WinRegister := RegisterClass (WindowClass)<>0;
  211. End;
  212. Function EditCreate(ParentWindow,Status:HWnd): HWnd;
  213. Const
  214. CS_Start = WS_Child or WS_HScroll or WS_VScroll or ES_MultiLine or ES_Left;
  215. CS_Ex = WS_EX_ClientEdge;
  216. EdiTText: PChar = '';
  217. Var
  218. HEdit: HWND;
  219. R: TRect;
  220. StatH: Word;
  221. { rev 1.5 : comment out
  222. Procedure AddText (S:String);
  223. begin
  224. S:=S+#0;
  225. SendMessage(HEdit,em_replacesel,0,longint(pchar(@S[1])));
  226. end;
  227. }
  228. Begin
  229. GetClientRect(Status,@R);
  230. StatH := R.Bottom-R.Top;
  231. GetClientRect(ParentWindow,@R);
  232. HEdit := CreateWindowEx (CS_Ex,'EDIT',EditText,CS_Start,0,0,
  233. R.Right-R.Left,R.Bottom-R.Top-StatH,ParentWindow,0,
  234. MainInstance,Nil);
  235. If HEdit<>0 Then
  236. Begin
  237. ShowWindow(Hedit,SW_Show);
  238. UpdateWindow(HEdit);
  239. End;
  240. EditCreate := HEdit;
  241. End;
  242. Function WinCreate: HWnd;
  243. Var hWindow: HWnd;
  244. Menu: hMenu;
  245. SubMenu: hMenu;
  246. Begin
  247. hWindow := CreateWindow (AppName,'EditDemo',ws_OverlappedWindow,
  248. cw_UseDefault,cw_UseDefault,cw_UseDefault,
  249. cw_UseDefault,0,0,MainInstance,Nil);
  250. If hWindow<>0 Then
  251. Begin
  252. Menu := CreateMenu;
  253. SubMenu := CreateMenu;
  254. AppendMenu(Submenu,MF_STRING,101,'&New...');
  255. AppendMenu(Submenu,MF_STRING,102,'&Open...');
  256. AppendMenu(Submenu,MF_STRING,103,'&Save...');
  257. AppendMenu(Submenu,MF_SEPARATOR,0,Nil);
  258. AppendMenu(SubMenu,MF_String,104,'E&xit');
  259. AppendMenu(Menu,MF_POPUP,SubMenu,'&Files');
  260. SubMenu := CreateMenu;
  261. AppendMenu(SubMenu,MF_String,201,'&Undo'#8'Ctrl+Z');
  262. AppendMenu(Submenu,MF_SEPARATOR,0,Nil);
  263. AppendMenu(SubMenu,MF_String,202,'&Cut'#8'Ctrl+X');
  264. AppendMenu(SubMenu,MF_String,203,'&Copy'#8'Ctrl+C');
  265. AppendMenu(SubMenu,MF_STRING,204,'&Paste'#8'Ctrl+V');
  266. AppendMenu(Menu,MF_POPUP,SubMenu,'&Edit');
  267. SubMenu := CreateMenu;
  268. AppendMenu(SubMenu,MF_String,301,'&Settings');
  269. AppendMenu(Menu,MF_POPUP,SubMenu,'&Options');
  270. AppendMenu(Menu,MF_STRING,401,'&Help');
  271. SetMenu(hWindow,menu);
  272. ShowWindow(hWindow,SW_Show);
  273. UpdateWindow(hWindow);
  274. End;
  275. WinCreate := hWindow;
  276. End;
  277. Function StatusCreate (parent:hwnd): HWnd;
  278. Begin
  279. StatusCreate := CreateStatusWindow (WS_CHILD Or WS_VISIBLE,'Ready...',parent,$7712);
  280. End;
  281. Begin
  282. If Not WinRegister Then
  283. Begin
  284. MessageBox (0,'Register failed',Nil, mb_Ok);
  285. End
  286. Else
  287. Begin
  288. hWindow := WinCreate;
  289. If longint(hWindow)=0 Then
  290. Begin
  291. MessageBox (0,'WinCreate failed',Nil,MB_OK);
  292. End
  293. Else
  294. Begin
  295. HStatus := statuscreate(hwindow);
  296. HEdit := EditCreate(HWindow,HStatus);
  297. SetFocus(HEdit);
  298. While GetMessage(@AMessage,0,0,0) Do
  299. Begin
  300. TranslateMessage(AMessage);
  301. DispatchMessage(AMessage);
  302. End;
  303. Halt(AMessage.wParam);
  304. End;
  305. End;
  306. End.
  307. {
  308. $Log$
  309. Revision 1.1 2000-02-20 20:33:37 florian
  310. * Initial revision
  311. }