Понедельник, 28.09.2026, 22:42
Вы вошли как Гость | Группа "Гости"Приветствую Вас Гость | RSS
Форма входа
Меню сайта
Главная » FAQ » Программирование Delphi [ Добавить вопрос ]

Программирование Delphi [91]
Вопрос-Ответ по программированию

Я хочу определить момент окончания изменения размера или перемещения окна. Перехватываю сообщения WM_SIZE и WM_MOVE но я получаю много таких сообщений а мне нужно узнать когда именно пользователь закончил перенос или изменение размеров окна. Возможно ли это?

В следующем примере показан перехват сообщения WM_EXITSIZEMOVE Хотя сообщение документированно только для Windows NT оно работает точно так же и под Windows 95. Обратите внимание что Вы можите перехватить сообщение WM_ENTERSIZEMOVEдля определения момента начала пользователем операции изменения размера или перемещения окна.
Пример :

 
             type 
               TForm1 = class(TForm) 
               private 
                 { Private declarations } 
               public 
                 procedure WMEXITSIZEMOVE(var Message: TMessage); 
                    message WM_EXITSIZEMOVE; 
                 { Public declarations } 
               end; 
 
             var 
               Form1: TForm1; 
 
             implementation 
 
             {$R *.DFM} 
             procedure TForm1.WMEXITSIZEMOVE(var Message: TMessage); 
             begin 
               Form1.Caption := 'Finished Moving and sizing'; 
             end; 


См пример. Примечание: не все файловые системы поддерживают время последнего доступа к файлу.
Пример :

 
             procedure TForm1.Button1Click(Sender: TObject); 
             var 
               SearchRec : TSearchRec; 
               Success : integer; 
               DT : TFileTime; 
               ST : TSystemTime; 
             begin 
               Success := SysUtils.FindFirst('C:\autoexec.bat', 
                                             faAnyFile, 
                                             SearchRec); 
              if (Success = 0) and 
                   (( SearchRec.FindData.ftLastAccessTime.dwLowDateTime <> 0) 
                   or ( SearchRec.FindData.ftLastAccessTime.dwHighDateTime <> 0)) 
              then 
               begin 
                 FileTimeToLocalFileTime(SearchRec.FindData.ftLastAccessTime,DT); 
                   FileTimeToSystemTime(DT,ST); 
                 Memo1.Lines.Clear; 
                 Memo1.Lines.Add('AutoExec.Bat was last accessed at:'); 
                 Memo1.Lines.Add('Year := ' + IntToStr(st.wYear)); 
                 Memo1.Lines.Add('Month := ' + IntToStr(st.wMonth)); 
                 Memo1.Lines.Add('DayOfWeek := ' + IntToStr(st.wDayOfWeek)); 
                 Memo1.Lines.Add('Day := ' + IntToStr(st.wDay)); 
                 Memo1.Lines.Add('Hour := ' + IntToStr(st.wHour)); 
                 Memo1.Lines.Add('Minute := ' + IntToStr(st.wMinute)); 
                 Memo1.Lines.Add('Second := ' + IntToStr(st.wSecond)); 
                 Memo1.Lines.Add('Milliseconds := ' + IntToStr(st.wMilliseconds)); 
               end; 
               SysUtils.FindClose(SearchRec); 
             end;

См. пример
Пример :

 
             uses ShellAPI, ShlObj; 
 
             procedure TForm1.Button1Click(Sender: TObject); 
             var 
               TitleName : string; 
               lpItemID : PItemIDList; 
               BrowseInfo : TBrowseInfo; 
               DisplayName : array[0..MAX_PATH] of char; 
               TempPath : array[0..MAX_PATH] of char; 
             begin 
               FillChar(BrowseInfo, sizeof(TBrowseInfo), #0); 
               BrowseInfo.hwndOwner := Form1.Handle; 
               BrowseInfo.pszDisplayName := @DisplayName; 
               TitleName := 'Please specify a directory'; 
               BrowseInfo.lpszTitle := PChar(TitleName); 
               BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS; 
               lpItemID := SHBrowseForFolder(BrowseInfo); 
               if lpItemId <> nil then begin 
                 SHGetPathFromIDList(lpItemID, TempPath); 
                 ShowMessage(TempPath); 
                 GlobalFreePtr(lpItemID); 
               end; 
             end; 

В следуещем примере используется функция Windows API FindWindow(). Обратите внимание, что WndClass консольного окна отличаются для Windows 95 и Window NT и заголовок окна может содержать полный путь под Windows NT.
Пример :

 
             procedure TForm1.Button1Click(Sender: TObject); 
             var 
               info : TOSVersionInfo; 
               ClassName : string; 
               Title : string; 
             begin 
              {Проверяем -  Win95 или NT.} 
               info.dwOSVersionInfoSize := sizeof(info); 
               GetVersionEx(info); 
               if (info.dwPlatformId = VER_PLATFORM_WIN32_NT) then begin 
                 ClassName := 'ConsoleWindowClass'; 
                 Title := 'Command Prompt'; 
               end else begin 
                 ClassName := 'tty'; 
                 Title := 'MS-DOS Prompt'; 
               end; 
               ShowMessage(IntToStr(FindWindow(PChar(ClassName), PChar(Title)))); 
             end; 

Следующий прмер перехватывает событие WM_TIMECHANGE. примечание: Приложение , изменяющее системное время должно посылать сообщение WM_TIMECHANGE всем окнам.

 
 
             type 
               TForm1 = class(TForm) 
               private 
                 { Private declarations } 
                 procedure WMTIMECHANGE(var Message: TWMTIMECHANGE); 
                    message WM_TIMECHANGE; 
               public 
                 { Public declarations } 
               end; 
 
             var 
               Form1: TForm1; 
 
             implementation 
 
             {$R *.DFM} 
 
             procedure TForm1.WMTIMECHANGE(var Message: TWMTIMECHANGE); 
             begin 
               Form1.Caption := 'Time Changed'; 
             end; 

Наш опрос
Сколько вам лет
Всего ответов: 20
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Поиск