|
Программируем по-русски
|
Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку. Издатель Глагола
|
ОТДЕЛ editdemo; ИСПОЛЬЗУЕТ Strings, Windows; ПОСТ AppName = 'EditDemo'; ВИД TFileName = РЯД [0..Max_Path] ИЗ ЗНАК; ПЕР AMessage :Msg; HWindow,HStatus,HEdit:HWnd; TheFont :HFont; TheLogFont :TLogFont; TheColor :DWORD; FileName :TFileName; (*────────────────────────────────────────────────────────────────────────────*) ЗАДАЧА SetStatusText(Num:ЦЕЛ; Text-:string); ПЕР StatText:РЯД [0..255] ИЗ ЗНАК; УКАЗ ЕСЛИ Num = 0 ТО StatText[0]:=' ' (* Add space to text in first item *) ИНАЧЕ StatText[0]:=#9; (* Center the rest *) КОН; StrPCopy(@StatText[1],Text); SendMessage(HStatus,SB_SETTEXT,WPARAM(Num),LPARAM(@StatText)); КОН SetStatusText; (*────────────────────────────────────────────────────────────────────────────*) ЗАДАЧА SelectFile(FName-:TFileName; Open+:КЛЮЧ):КЛЮЧ; ПОСТ Filter:PChar = 'Text files (*.txt)'#0'*.txt'#0'All files (*.*)'#0'*.*'#0#0; Ext :PChar = 'txt'; ПЕР NameRec:OpenFileName; УКАЗ FillChar(NameRec,SizeOf(NameRec),0); FName[0]:=#0; ДЛЯ NameRec ВЫП LStructSize:=SizeOf(NameRec); HWndOwner :=HWindow; LpStrFilter:=Filter; LpStrFile :=@FName; NMaxFile :=Max_Path; Flags :=OFN_Explorer ИЛИ OFN_HideReadOnly; ЕСЛИ Open ТО Flags:=Flags ИЛИ OFN_FileMustExist КОН; LpStrDefExt:=Ext КОН; ЕСЛИ Open ТО ВОЗВРАТ GetOpenFileName(@NameRec) ИНАЧЕ ВОЗВРАТ GetSaveFileName(@NameRec) КОН КОН SelectFile; (*────────────────────────────────────────────────────────────────────────────*) ЗАДАЧА SaveText; ПЕР Len :ЦЕЛ; P :PChar; F :File; FName:TFileName; УКАЗ ЕСЛИ SelectFile(FName,False) ТО Assign(F,@FName); Rewrite(F,1); Len:=GetWindowTextLength(HEdit); GetMem(P,Len+1); P[Len]:=#0; ЕСЛИ Len>0 ТО GetWindowText(HEdit,P,Len+1); BlockWrite(F,P^,Len); КОН; Close(F); FreeMem(P,Len+1); StrCopy(FileName,FName); SetStatusText(0,StrPas(FileName)); SetStatusText(1,''); SendMessage(HEdit,EM_SetModify,0,0); КОН КОН SaveText; (*────────────────────────────────────────────────────────────────────────────*) ЗАДАЧА AskSave; ПОСТ BoxType = MB_IconQuestion ИЛИ MB_YesNo; УКАЗ ЕСЛИ SendMessage(HEdit,EM_GetModify,0,0) # 0 ТО ЕСЛИ MessageBox(HWindow,'Save text?','Edited',BoxType)=IdYes ТО SaveText; КОН; КОН КОН AskSave; (*────────────────────────────────────────────────────────────────────────────*) ЗАДАЧА LoadText; ПЕР F :File; Len :ЦЕЛ; P :PChar; УКАЗ AskSave; ЕСЛИ SelectFile(FileName,True) ТО Assign(F,@FileName); Reset(F,1); Len:=FileSize(F); GetMem(P,Len+1); P[Len]:=#0; ЕСЛИ Len>0 ТО BlockRead(F,P^,Len) КОН; Close(F); SetWindowText(HEdit,P); SendMessage(HEdit,EM_SetModify,0,0); FreeMem(P,Len+1); SetStatusText(0,StrPas(FileName)); SetStatusText(1,''); КОН КОН LoadText; (*────────────────────────────────────────────────────────────────────────────*) ЗАДАЧА NewText; ПОСТ Empty:PChar = ''; УКАЗ AskSave; FileName:='Unsaved'; SetStatusText(0,StrPas(FileName)); SendMessage(HEdit,WM_SetText,1,LRESULT(Empty)); SendMessage(HEdit,EM_SetModify,0,0); КОН NewText; (*────────────────────────────────────────────────────────────────────────────*) ЗАДАЧА SelectFont; ПЕР ChooseFontRec:TChooseFont; УКАЗ ДЛЯ ChooseFontRec ВЫП lStructSize :=SizeOf(ChooseFontRec); hwndOwner :=HWindow; hDC :=0; lpLogFont :=@TheLogFont; iPointSize :=0; Flags :=CF_INITTOLOGFONTSTRUCT ИЛИ CF_SCREENFONTS ИЛИ CF_EFFECTS; rgbColors :=TheColor; lCustData :=0; lpfnHook :=ПУСТО; lpTemplateName:=ПУСТО; hInstance :=0; lpszStyle :=ПУСТО; nFontType :=0; nSizeMin :=0; nSizeMax :=0; КОН; ЕСЛИ ChooseFont(@ChooseFontRec) ТО DeleteObject(TheFont); TheColor:=ChooseFontRec.rgbColors; TheFont:=CreateFontIndirect(@TheLogFont); SendMessage(HEdit,WM_SETFONT,WPARAM(TheFont),1); КОН КОН SelectFont; (*────────────────────────────────────────────────────────────────────────────*) ЗАДАЧА WindowProc ( Window:HWnd; AMessage:UINT; WParam:WPARAM; LParam:LPARAM):LRESULT; stdcall; export; ПЕР R :rect; StatH :LONG; NrMenu :ЦЕЛ; NotiCode:ЦЕЛ; УКАЗ WindowProc:=0; ВЫБРАТЬ AMessage ИЗ | wm_Close: AskSave | wm_Destroy: PostQuitMessage (0); ВОЗВРАТ | wm_SetFocus: SetFocus(HEdit) | WM_EraseBkgnd: ВОЗВРАТ(1) | wm_Size: GetClientRect(HStatus,@R); StatH:=R.Bottom-R.Top; GetClientRect(Window,@R); MoveWindow(HEdit,0,0,R.Right,R.Bottom-StatH,False); MoveWindow(HStatus,0,R.Bottom-StatH,R.Right,R.Bottom,False) | wm_Command: NotiCode:=HiWord(WParam); ВЫБРАТЬ NotiCode ИЗ en_Change: (*// Editor has changed *) ЕСЛИ SendMessage(HEdit,EM_GetModify,0,0) # 0 ТО SetStatusText(1,'Modified') ИНАЧЕ SetStatusText(1,''); КОН ИНАЧЕ (*// Menu item *) NrMenu:=LoWord(WParam); ВЫБРАТЬ NrMenu ИЗ | 101:NewText | 102:LoadText | 103:SaveText | 104:PostMessage(Window,WM_Close,0,0) | 201:SendMessage(HEdit,WM_Undo,0,0) | 202:SendMessage(HEdit,WM_Cut,0,0) | 203:SendMessage(HEdit,WM_Copy,0,0) | 204:SendMessage(HEdit,WM_Paste,0,0) | 301:SelectFont | 401:MessageBox(Window, 'Help', 'НЕ implemented', MB_OK ИЛИ MB_IconInformation) КОН КОН | wm_CtlColorEdit: SetTextColor(WParam,TheColor); ВОЗВРАТ GetSysColorBrush(COLOR_WINDOW) КОН; ВОЗВРАТ DefWindowProc(Window,AMessage,WParam,LParam) КОН WindowProc; (*────────────────────────────────────────────────────────────────────────────*) ЗАДАЧА WinRegister:КЛЮЧ; ПЕР WindowClass:WndClass; УКАЗ ДЛЯ WindowClass ВЫП Style :=cs_hRedraw ИЛИ cs_vRedraw; lpfnWndProc :=WndProc(@WindowProc); cbClsExtra :=0; cbWndExtra :=0; hInstance :=system.MainInstance; hIcon :=LoadIcon (0,idi_Application); hCursor :=LoadCursor (0,idc_Arrow); hbrBackground:=GetStockObject(GRAY_BRUSH); lpszMenuName:=ПУСТО; lpszClassName:=AppName; КОН; ВОЗВРАТ (RegisterClass(WindowClass) # 0) КОН WinRegister; (*────────────────────────────────────────────────────────────────────────────*) ЗАДАЧА EditCreate(ParentWindow,Status:HWnd):HWnd; ПОСТ CS_Start = WS_Child ИЛИ WS_HScroll ИЛИ WS_VScroll ИЛИ ES_MultiLine ИЛИ ES_Left; CS_Ex = WS_EX_ClientEdge; EdiTText:PChar = ''; ПЕР HEdit:HWND; R :TRect; StatH:Word; УКАЗ GetClientRect(Status,@R); StatH:=R.Bottom-R.Top; GetClientRect(ParentWindow,@R); HEdit:=CreateWindowEx (CS_Ex, 'EDIT', EditText,CS_Start,0,0, R.Right-R.Left, R.Bottom-R.Top-StatH, ParentWindow,0, MainInstance,ПУСТО); ЕСЛИ HEdit # 0 ТО (*// Set Courier new as default font *) ДЛЯ TheLogFont ВЫП lfHeight :=0; (*// Default logical height ИЗ font *) lfWidth :=0; (*// Default logical average character width *) lfEscapement :=0; (*// angle ИЗ escapement *) lfOrientation :=0; (*// base-line orientation angle *) lfWeight :=FW_NORMAL; (*// font weight *) lfItalic :=0; (*// italic attribute flag *) lfUnderline :=0; (*// underline attribute flag *) lfStrikeOut :=0; (*// strikeout attribute flag *) lfCharSet :=DEFAULT_CHARSET; (*// character set identifier *) lfOutPrecision :=OUT_DEFAULT_PRECIS; (*// output precision *) lfClipPrecision:=CLIP_DEFAULT_PRECIS; (*// clipping precision *) lfQuality :=DEFAULT_QUALITY; (*// output quality *) lfPitchAndFamily:=DEFAULT_PITCH; (*// pitch И family *) Strcopy(lfFaceName,'Courier New'); (*// pointer to typeface name string *) КОН; TheColor:=GetSysColor(COLOR_WINDOWTEXT); TheFont:=CreateFontIndirect(@TheLogFont); SendMessage(HEdit,WM_SETFONT,WPARAM(TheFont),1); ShowWindow(Hedit,SW_Show); UpdateWindow(HEdit); КОН; ВОЗВРАТ HEdit КОН EditCreate; (*────────────────────────────────────────────────────────────────────────────*) ЗАДАЧА WinCreate:HWnd; ПЕР hWindow:HWnd; Menu :hMenu; SubMenu:hMenu; УКАЗ hWindow:=CreateWindow (AppName, 'EditDemo', ws_OverlappedWindow, cw_UseDefault, cw_UseDefault, cw_UseDefault, cw_UseDefault,0,0,MainInstance,ПУСТО); ЕСЛИ hWindow # 0 ТО Menu:=CreateMenu; SubMenu:=CreateMenu; AppendMenu(Submenu,MF_STRING,101,'&New...'); AppendMenu(Submenu,MF_STRING,102,'&Open...'); AppendMenu(Submenu,MF_STRING,103,'&Save...'); AppendMenu(Submenu,MF_SEPARATOR,0,ПУСТО); AppendMenu(SubMenu,MF_String,104,'E&xit'); AppendMenu(Menu,MF_POPUP,SubMenu,'&File'); SubMenu:=CreateMenu; AppendMenu(SubMenu,MF_String,201,'&Undo'#8'Ctrl+Z'); AppendMenu(Submenu,MF_SEPARATOR,0,ПУСТО); AppendMenu(SubMenu,MF_String,202,'&Cut'#8'Ctrl+X'); AppendMenu(SubMenu,MF_String,203,'&Copy'#8'Ctrl+C'); AppendMenu(SubMenu,MF_STRING,204,'&Paste'#8'Ctrl+V'); AppendMenu(Menu,MF_POPUP,SubMenu,'&Edit'); SubMenu:=CreateMenu; AppendMenu(SubMenu,MF_String,301,'&Font...'); AppendMenu(Menu,MF_POPUP,SubMenu,'&Options'); AppendMenu(Menu,MF_STRING,401,'&Help'); SetMenu(hWindow,menu); ShowWindow(hWindow,SW_Show); UpdateWindow(hWindow); КОН; ВОЗВРАТ hWindow КОН WinCreate; (*────────────────────────────────────────────────────────────────────────────*) ЗАДАЧА StatusCreate (parent:hwnd):HWnd; ПЕР AWnd :HWnd; Edges :РЯД [1..2] ИЗ ЦЕЛ; УКАЗ FileName:='Unsaved'; AWnd:=CreateStatusWindow(WS_CHILD ИЛИ WS_VISIBLE,FileName,Parent,$7712); (*// Create items: *) ЕСЛИ AWnd # 0 ТО Edges[1]:=400; Edges[2]:=500; SendMessage(AWnd,SB_SETPARTS,2,LPARAM(@Edges)); КОН; ВОЗВРАТ AWnd КОН StatusCreate; (*────────────────────────────────────────────────────────────────────────────*) УКАЗ ЕСЛИ НЕ WinRegister ТО MessageBox(0,'Register failed',ПУСТО,mb_Ok); ИНАЧЕ hWindow:=WinCreate; ЕСЛИ ЦЕЛ(hWindow) = 0 ТО MessageBox(0,'WinCreate failed',ПУСТО,MB_OK); ИНАЧЕ HStatus:=statuscreate(hwindow); HEdit:=EditCreate(HWindow,HStatus); SetFocus(HEdit); ПОКА GetMessage(@AMessage,0,0,0) ВЫП TranslateMessage(AMessage); DispatchMessage(AMessage); КОН; DeleteObject(TheFont); СТОП(AMessage.wParam); КОН КОН КОН editdemo. ▲ Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com или Издателю Глагола:
|
|