Главная > Программирование > Языки Pascal/Delphi > |
RU.DELPHI.CHAINIK FAQ |
Секция 2 из 3 - Предыдущая - Следующая
Все секции
- 1
- 2
- 3
Q-50: Какое событие происходит при минимизации окна? ------------------------------------------------------------ OnResize Для MainForm : Application.OnMinimize ------------------------------------------------------------ Q-51: Как сохранить в ini файле настройки TFont? ------------------------------------------------------------ uses IniFiles; procedure TForm1.Button1Click(Sender: TObject); var IniFile : TIniFile; begin IniFile := TIniFile.Create('myIni.ini'); with Edit1.Font do with IniFile do begin Name := ReadString ('Font','Name','MS Mans Serif'); Charset := ReadInteger('Font','Charset',RUSSIAN_CHARSET); Color := ReadInteger('Font','Color', clWindowText); Height := ReadInteger('Font','Height',-11); Size := ReadInteger('Font','Size',8); Style := TFontStyles(Byte(ReadInteger('Font','Style',0))); end; IniFile.Free; end; procedure TForm1.Button2Click(Sender: TObject); var IniFile : TIniFile; begin IniFile := TIniFile.Create('myIni.ini'); with Edit1.Font do with IniFile do begin; WriteString ('Font','Name', Name); WriteInteger('Font','Charset', Charset); WriteInteger('Font','Color', Color); WriteInteger('Font','Height', Height); WriteInteger('Font','Size', Size); WriteInteger('Font','Style',Byte(Style)); end; IniFile.Free; end; ------------------------------------------------------------ Q-52: Как закрыть внешнюю программу? ------------------------------------------------------------ Например, Блокнот можно закрыть так: procedure TForm1.Button1Click(Sender: TObject); var phandle : HWND; begin phandle := FindWindow('Notepad', nil); if phandle = 0 then RaiseLastWin32Error; SendMessage(phandle, WM_CLOSE, 0, 0); end; ------------------------------------------------------------ Q-53: Как загрузить из ImageList иконку приложения? ------------------------------------------------------------ ImageList1.GetIcon(Idx, Application.Icon); ------------------------------------------------------------ Q-54: Как отловить нажатие Enter в TEdit? ------------------------------------------------------------ IMHO, чтобы сделать в духе Windows, то добавь к Edit один TButton, с свойством default := True, обработчик OnClick которой будет делать нужную работу. Другие варианты, чреваты тем, что может сработать не то, что ожидается. Вот последовательность как будут вызываться обработчики при нажатии Enter 1. OnClick кнопки default 2. OnClick формы, если у нее KeyPreview := True; 3. OnKeyDown/KeyPress/KeyUp контрола имеющего фокус ввода. Это особенность роли, которую этой клавише обычно назначают в win приложениях. Обрати также внимание на свойство TButton Cancel - оно заставляет срабатывать кнопку при нажатии Esc Для того чтобы разобраться в этих моментах попробуй неколько вариантов, снимая комментарии: procedure TForm1.Button1Click(Sender: TObject); begin //Button1.Default := True; ShowMessage('Key1'); end; procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin //KeyPreview := True; if Key = #13 then begin ShowMessage('Key2'); Key := #0; end; end; procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if key = #13 then ShowMessage('Key3'); end; ------------------------------------------------------------ Q-55: В какой позиции Memo находится каретка? ------------------------------------------------------------ var LineNum, Charnum: Integer; .... LineNum := Memo1.Perform(EM_LINEFROMCHAR, -1, 0); CharNum := Memo1.Perform(EM_LINEINDEX, LineNum, 0); ------------------------------------------------------------ Q-56: Почему после RichEdit1.Lines.SaveToFile(name) в файле, кроме моего текста, ещё всякий бред написан? ------------------------------------------------------------ Таким образом в RTF сохраняется информация об оформлении текста. Если сохранять нужно только текст, перед записью сделай RichEdit1.PlainText := True; ------------------------------------------------------------ Q-57: Как вставить картинку в TDrawGrid? ------------------------------------------------------------ procedure TForm1.DrawGrid1DrawCell(Sender: TObject; Col, Row: Integer; Rect: TRect; State: TGridDrawState); begin if (Sender is TDrawGrid) and not (gdFixed in State) then TDrawGrid(Sender).Canvas.Draw(Rect.Left, Rect.Top, Image1.Picture.Graphic); end; ------------------------------------------------------------ Q-58: Как дождаться завершения программы, запущенной ShellExecute? ------------------------------------------------------------ uses ShellAPI; procedure TForm1.Button1Click(Sender: TObject); var ProcInfo: PShellExecuteInfo; begin (Sender as TControl).Enabled := False; GetMem(ProcInfo, SizeOf(ProcInfo^)); with ProcInfo^ do begin Wnd := Handle; cbSize := SizeOf(ProcInfo^); lpFile := PChar('notepad.exe'); lpParameters := nil; lpVerb := 'open'; nShow := SW_SHOW; fMask := SEE_MASK_DOENVSUBST or SEE_MASK_NOCLOSEPROCESS; end; try Win32check(ShellExecuteEx(ProcInfo)); while not Application.Terminated and (WaitForSingleObject(ProcInfo.hProcess, 100)=WAIT_TIMEOUT) do Application.ProcessMessages; finally if ProcInfo.hProcess <> 0 then CloseHandle(ProcInfo.hProcess); Dispose(ProcInfo); (Sender as TControl).Enabled := True; end; end; ------------------------------------------------------------ Q-59: Как в TMemo вставить дату в позицию каретки? ------------------------------------------------------------ Memo1.SetSelTextBuf(PChar(DateToStr(Date))); ------------------------------------------------------------ Q-60: Как отловить системную ошибку при операциях с файлами? ------------------------------------------------------------ Для Паскаль функций, например, BlockWrite, можно использовать такую конструкцию: try BlockWrite(f, buf, count); //См.также хелп: параметр AmtTransferred .. except on E:EInOutError do begin ShowMessage('Произошла ошибка записи ' + E.Message); ..// пытаемся что-то поправить if {не удалось} then raise; //Повторно возбуждаем исключение, чтобы не удалить файл end; end; .. CloseFile(..); DeleteFile(..); ------------------------------------------------------------ Q-61: Как узнать, была ли создана ли определенная форма? ------------------------------------------------------------ function IndexOfForm (const AClassName: String; const FromIndex: Word):Integer; var i : Integer; begin Result := -1; for i := FromIndex to Screen.FormCount-1 do if (CompareText(Screen.Forms[i].ClassName, AClassName) = 0) then begin Result := i; Break; end; end; ------------------------------------------------------------ Q-62: Что такое Handle окна, и как его полyчить? ------------------------------------------------------------ Handle - это число - уникальный идентификатор окна (в данном случае) в системе. Получить его можно, например, так: hwnd := FindWindow (nil, 'Form1'); //ищем окнo с заголовком "Form1" if hwnd <> 0 then {нашлось}; ------------------------------------------------------------ Q-63: Как проиграть midi файл? ------------------------------------------------------------ uses MPlayer; var mp : TMediaPlayer; procedure TForm1.Button1Click(Sender: TObject); begin with Sender as TButton do case Tag of 0 : begin Tag := 1; mp := TMediaPlayer.CreateParented(Handle); mp.DeviceType := dtSequencer; mp.FileName := 'c:\winnt\media\Canyon.mid'; mp.Wait:= True; mp.Open; mp.Play; end; 1 : begin Tag := 0; mp.Wait := True; mp.Stop; mp.Free; end; end; end; ------------------------------------------------------------ Q-64: Как обратиться к свойству по его имени? ------------------------------------------------------------ type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private f1 : Integer; // Это приватное поле хранит значение published {К свойству p1 мы будем обращаться по его имени} property p1 : Integer read f1 write f1; end; var Form1: TForm1; implementation {$R *.DFM} uses TypInfo; procedure TForm1.Button1Click(Sender: TObject); var PInfo : PPropInfo; begin p1 := GetTickCount; // Здесь свойству что-то присвоили PInfo:= GetPropInfo(TForm1.ClassInfo, 'p1'); // Получаем описание свойства // из описания класса if PInfo = nil then raise Exception.Create('Property not exist'); Caption := IntToStr(GetOrdProp(Form1, PInfo)); // Получаем значение свойства end; ------------------------------------------------------------ Q-65: Как нажать Ctrl+Del программным путем? ------------------------------------------------------------ keybd_event(vk_control, 0, 0, 0); keybd_event(vk_delete, 0, 0, 0); keybd_event(vk_delete, 0, KEYEVENTF_KEYUP, 0); keybd_event(vk_control, 0, KEYEVENTF_KEYUP, 0); ------------------------------------------------------------ Q-66: Аналог Case для строк ------------------------------------------------------------ Вопрос: Нужно определить с какой из заданных строк совпадает некая строковая переменная и в зависимости от этого перейти к соответсвующей процедуре. Как это выполнить без использования многочисленных if - then? Вот способ, легко приспосабливаемый для загрузки списка из строки, файла или ресурса: const vlist = 'первый, второй, третий'; var Values: TStringList; procedure SetValues(VL : TStringList; S: String); var I : Integer; begin VL.CommaText := S; for I := 0 to CL.Count-1 do VL.Objects[I] := Pointer(I); VL.Sorted := True; end; function GetValueIndex(VL : TStringList; Match: String): Integer; begin Result := VL.IndexOf(Match); if Result >= 0 then Result := Integer(VL.Objects[Result]); end; procedure TForm1.Button1Click(Sender: TObject); begin case GetValueIndex(Values, Edit1.Text) of -1: {не найден} ; 0: Caption := '0'; 1: Caption := '1'; 2: Caption := '2'; end; end; initialization VL := TStringList.Create; SetValues(VL, vlist); finalization VL.Free; ------------------------------------------------------------ Q-67: Как в TListBox пеpетаскивать итемы? ------------------------------------------------------------ DragMode := dmAutomatic; {OnDragOver} procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Accept := True; end; {OnDragDrop} procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer); var NewIndex : Integer; begin with Sender as TListBox do begin NewIndex := ItemAtPos(Point(X,Y), True); Items.Move(ItemIndex, NewIndex); ItemIndex:= NewIndex; end; end; ------------------------------------------------------------ Q-68: Как отловить нажатие клавиш F1..F10? ------------------------------------------------------------ procedure TForm1.AppMessage(var Msg:TMsg; var Handled: Boolean); begin case msg.wParam of VK_F1..VK_F10 : case Msg.message of WM_KEYUP: ShowMessage('Key up'); WM_KEYDOWN: ShowMessage('Key down'); end; end; end; procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMessage := AppMessage; end; ------------------------------------------------------------ Q-69: Как записать в файл несколько TImage? ------------------------------------------------------------ procedure TForm1.Button1Click(Sender: TObject); begin with TFileStream.Create(FileName,fmCreate or fmOpenWrite) do begin WriteComponentRes('IMAGE1', image1); WriteComponentRes('IMAGE2', image2); Free; end; end; procedure TForm1.Button2Click(Sender: TObject); begin Image1.Free; Image2.Free; RegisterClass(TImage); Image1 := TImage.Create(Self); Image2 := TImage.Create(Self); with TFileStream.Create(FileName, fmOpenRead) do begin ReadComponentRes(Image1); ReadComponentRes(Image2); Free; end; Image1.Parent:= Self; Image2.Parent:= Self; UnregisterClass(TImage); end; ------------------------------------------------------------ Q-70: Как компьютеру узнать свое имя? ------------------------------------------------------------ function GetCompName: String; var buffer : array [0..MAX_COMPUTERNAME_LENGTH] of Char; cb : DWord; begin cb := SizeOf(buffer); GetComputerName(buffer, cb); Result := buffer; end; ------------------------------------------------------------ Q-71: Как узнать IP машины по имени? ------------------------------------------------------------ uses WinSock; const WINSOCK_VERSION = $0101; function GetIPAddress(Name:String): string; var WSAData : TWSAData; p : PHostEnt; begin WSAStartup(WINSOCK_VERSION, WSAData); p := GetHostByName(PChar(Name)); Result := inet_ntoa(PInAddr(p.h_addr_list^)^); WSACleanup; end; ------------------------------------------------------------ Q-72: Как показать текстовый файл в TLabel? ------------------------------------------------------------ procedure TForm1.Button1Click(Sender: TObject); var fs : TFileStream; s : String; begin fs := TFileStream.Create('unit1.pas', fmOpenRead or fmShareDenyNone ); SetLength(s, fs.Size); fs.Read(s[1], Length(s)); fs.Free; Label1.Caption := s; end; ------------------------------------------------------------ Q-73: Как вставить картинку в StatusPanel? ------------------------------------------------------------ Image1.Parent := StatusBar1; ------------------------------------------------------------ Q-74: Как показывать хинты для частично видимых элементов ListBox? ------------------------------------------------------------ Написать для OnMouseMove: procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); const oldidx : Longint = -1; var idx : Longint; begin with Sender as TListBox do begin idx := ItemAtPos(Point(x,y),True); if (idx < 0) or (idx = oldidx) then Exit; Application.ProcessMessages; Application.CancelHint; oldidx := idx; Hint := ''; if Canvas.TextWidth(Items[idx]) > Width - 4 then Hint:=Items[idx]; end; end; ------------------------------------------------------------ Q-75: Чем отличаются TLabel и TStaticText? ------------------------------------------------------------ TLabel is TGraphicControl TStaticText is TWinControl То есть у последнего есть окно, это дает возможность управлять этим контролом с помощью сообщений Windows. ------------------------------------------------------------ Q-76: Как корректнее завершать приложение- Terminate или MainForm.Close? ------------------------------------------------------------ Terminate очень грубый метод. Если вызывать Application.Terminate, то не сработают обработчики OnCloseQuery, OnClose главной формы. ------------------------------------------------------------ Q-77: Как помигать Scroll Lock? ------------------------------------------------------------ procedure TForm1.Timer1Timer(Sender: TObject); begin keybd_event(VK_SCROLL, 0, 0, 0); keybd_event(VK_SCROLL, 0, vk_up, 0); end; ------------------------------------------------------------ Q-78: Как отобразить каталог? ------------------------------------------------------------ ListBox1.Perform(LB_DIR, 0, LParam(PChar('*.*'))); ------------------------------------------------------------ Q-79: Как ввести текст в "чужой" Edit? ------------------------------------------------------------ SendMessage(EditHandle, WM_SETTEXT, 0, LParam(PChar('MyText'))); ------------------------------------------------------------ Q-80: Как сделать программу без главной формы? ------------------------------------------------------------ program Project1; uses Dialogs; begin ShowMessage('Is there anybody out there ?' ); end. ------------------------------------------------------------ Q-81: Как показать диалог выбора директории? ------------------------------------------------------------ из модуля FileCtrl. 1. function SelectDirectory(const Caption: string; const Root: WideString; out Directory: string): Boolean; overload; 2. function SelectDirectory(var Directory: string; Options: TSelectDirOpts; HelpCtx: Longint): Boolean; overload; из RxLib TDirectoryEdit function GetDirectory(nFolder: Longint): String; var Bi : TBrowseInfo; lpName: array [0..MAX_PATH] of Char; ppidl, aItemLst : PItemIDList; begin SHGetSpecialFolderLocation(Application.Handle, nFolder, ppidl); FillChar(Bi, SizeOf(bi), 0); Bi.hwndOwner := Application.Handle; Bi.pidlRoot := ppidl; Bi.pszDisplayName := lpName; Bi.lpszTitle := 'Open directory'; aItemLst := SHBrowseForFolder(Bi); CoTaskMemFree(ppidl); SHGetPathFromIDList(aItemLst, lpName); CoTaskMemFree(aItemLst); Result := lpName; end; Пример использования (иначе не поймут, что такое nFolder) // значения nFolder можно найти в описании // к SHGetSpecialFolderLocation // из Win32 Programmer's Reference (win32.hlp) procedure TForm1.Button1Click(Sender: TObject); begin Caption := GetDirectory(CSIDL_DRIVES); end; ------------------------------------------------------------ Q-82: Кaк искать oкнo по части eгo нaзвaния? ------------------------------------------------------------ function FindNextWnd(StartHWND: HWND; AString : String): HWND; var Buffer : array [0..255] of char; begin Result := StartHWND; repeat Result := FindWindowEx(0, Result, nil, nil); GetWindowText(Result, Buffer, SizeOf(Buffer)); if StrPos(StrUpper(Buffer), PChar(UpperCase(AString))) <> nil then Break; until (Result = 0); end; ------------------------------------------------------------ Q-83: Как yзнать текущую Ru/En pаскладкy клавиатypы? ------------------------------------------------------------ GetKeyboardLayoutName(buffer{:array [0..KL_NAMELENGTH] of Char}); case ((StrToInt('$'+ Buffer)) and $03FF) of LANG_ENGLISH: Caption := 'Eng'; LANG_RUSSIAN: Caption := 'Rus'; end; ------------------------------------------------------------ Q-84: Как RichEdit сделать скролл на конец текста? ------------------------------------------------------------ with RichEdit do begin SelLength := 0; SelStart := Length(Text); Perform(EM_SCROLLCARET,0,0); end; ------------------------------------------------------------ Q-85: Как узнать состояние управляющих клавиш - Shift, Ctrl, Alt? ------------------------------------------------------------ function IsKeyDown(vk: Word):Boolean; begin Result := GetKeyState(vk) and $8000 = $8000; end; vk для Ctrl, Shift, Alt соответственно равны: vk_control, vk_shift и vk_menu ------------------------------------------------------------ Q-86: Как контрол может сам себя разрушить? ------------------------------------------------------------ TMyWinControl = class(TWinControl) private procedure WMuser1(var msg: TMessage); message WM_USER+1; ... public procedure Release; ... end; procedure TMyWinControl.WMuser1; begin Free; end; procedure TMyWinControl.Release; begin PostMessage(Handle, WM_USER+1, 0, 0); end; ------------------------------------------------------------ Q-87: Как заставить MediaPlayer крутить один и тот же клип? ------------------------------------------------------------ procedure TForm1.WMUser1(var msg:TMessage);// message WM_USER+1; begin with MediaPlayer1 do begin Previous; Notify := True; Play; end; end; procedure TForm1.MediaPlayer1Notify(Sender: TObject); begin if (Sender as TMediaPlayer).NotifyValue = nvSuccessful then PostMessage(Handle, WM_USER+1, 0, 0); end; ------------------------------------------------------------ Q-88: Какой класс окна у консоли? ------------------------------------------------------------ 'tty' for 9x 'ConsoleWindowClass' for NT ------------------------------------------------------------ Q-89: Как спрятать контрол, если известен его Handle? ------------------------------------------------------------ ShowWindow(ButtonHandle, SW_HIDE); // SW_SHOW ------------------------------------------------------------ Q-90: Как сделать окно без VCL? ------------------------------------------------------------ program Project1; { Copyright (c) 1996 by Charlie Calvert Standard Windows API application written in Object Pascal. No VCL code included. This is all done on the Windows API level. Note that you need to include both Windows and Messages!} uses Windows, Messages; const AppName = 'Window1'; function WindowProc(Window: HWnd; AMessage, WParam, LParam: Longint): Longint; stdcall; begin WindowProc := 0; case AMessage of wm_Destroy: begin PostQuitMessage(0); Exit; end; end; WindowProc := DefWindowProc(Window, AMessage, WParam, LParam); end; { Register the Window Class } function WinRegister: Boolean; var WindowClass: TWndClass; begin WindowClass.Style := cs_hRedraw or cs_vRedraw; WindowClass.lpfnWndProc := @WindowProc; WindowClass.cbClsExtra := 0; WindowClass.cbWndExtra := 0; WindowClass.hInstance := HInstance; WindowClass.hIcon := LoadIcon(0, idi_Application); WindowClass.hCursor := LoadCursor(0, idc_Arrow); WindowClass.hbrBackground := HBrush(Color_Window); WindowClass.lpszMenuName := nil; WindowClass.lpszClassName := AppName; Result := RegisterClass(WindowClass) <> 0; end; { Create the Window Class } function WinCreate: HWnd; var hWindow: HWnd; begin hWindow := CreateWindow(AppName, 'Object Pascal Window', ws_OverlappedWindow, cw_UseDefault, cw_UseDefault, cw_UseDefault, cw_UseDefault, 0, 0, HInstance, nil); if hWindow <> 0 then begin ShowWindow(hWindow, CmdShow); UpdateWindow(hWindow); end; Result := hWindow; end; var AMessage: TMsg; hWindow: HWnd; begin if not WinRegister then begin MessageBox(0, 'Register failed', nil, mb_Ok); Exit; end; hWindow := WinCreate; if hWindow = 0 then begin MessageBox(0, 'WinCreate failed', nil, mb_Ok); Exit; end; while GetMessage(AMessage, 0, 0, 0) do begin TranslateMessage(AMessage); DispatchMessage(AMessage); end; Halt(AMessage.wParam); end. ------------------------------------------------------------ Q-91: Как записать массив в файл? ------------------------------------------------------------ with TFileStream.Create('array.dat', fmCreate or fmOpenWrite) do begin WriteBuffer(a, SizeOf(a)); Free; end; ------------------------------------------------------------ Q-92: О библиотеке RxLib ------------------------------------------------------------ На сайте delphiplus.org в разделе Бесплатно|RXLibrary (http://delphiplus.spils.lv/RXLibrary.html) лежит RX Library 2.75 с help'ами и четырьмя неофициальными портами RX Library 2.75 под Delphi 6: 1. Версия 1.1 (1.18M) от Oxygen Software 2. Версия 1 (1.36M) от Dennis Ortiz 3. Патч на RxLib версия 1.5 (437K) от Polaris Software 4. Версия от Epsylon Technologies Anatoly Podgoretsky wrote: > > Hi, Delphi Plus! > You wrote to Anatoly Podgoretsky on Tue, 20 Nov 2001 16:00:55 +0000 (UTC): > > DP> 14.11.2001 в раздел "Бесплатно|Компоненты" выложен четвертый > DP> неофициальный порт RX Library 2.75 под Delphi 6 (от Epsylon > DP> Technologies). > > DP> http://www.delphiplus.org - ежедневные новости информационных > DP> технологий http://www.faq.delphiplus.org - коллекция FAQ по Delphi > > Прекрасно, этим я больше доверяю, а как вообще насчет характеристики всех > четырех портов, а то у людей глаза разбегаются :-) Epsylon Technologies ------------------- Здравствуйте! Мы были вынуждены сделать свой вариант RxLib потому, что остальные нас немного не устраивали. Сразу скажу, зачем нам вообще нужна библиотека RxLib - она используется в нашем продукте в качестве некоего примера всем известных компонентов. Поэтому к такой библиотеке с нашей стороны предъявлялось требование максимальной стандартности, если можно применить такой термин. Кроме того, наш продукт поддерживает несколько версий Delphi и C++Builder, поэтому от такой библиотеки требуется одновременная поддержка всех нужных нам версий компиляторов. Естественно, мы рассматривали варианты использования уже готовой работы по адаптированию библиотеки под Delphi 6.0. Однако: - вариант от Polaris заточен для использования пакета Polaris Library. Туда что-то добавлено, что-то починено, что-то переделано. Иначе говоря, этот вариант не может быть стандартным; - вариант от Oxygen является версией ТОЛЬКО под Delphi 6.0, содержит ряд мелких неточностей при переводе design-time кода. Также там что-то изменено по сравнению с 2.75. Кроме того, не переименован модуль AppUtils.pas; - вариант от Dennis Ortiz также является версией только под Delphi 6.0. Ничего не могу сказать про нее - мы туда глубоко не заглядывали. Не совсем понятно, зачем выкидывать из библиотеки возможность поддержки предыдущих версий Delphi, когда добавить вариант кода для Delphi 6.0 ничуть не сложнее. Никто также не против исправления каких-либо ошибок в библиотеке, но давайте делать это централизованно, если уж авторы забили на свое детище. Например, через тот же Source Forge. Наш вариант основан на общедоступном коде, и содержит модули из 2.75, включая update от 16.12.1999 и патч для C+Builder 5.0 от 30.05.2000. В эти модули добавлена возможность работы под Delphi 6.0, в том числе добавлен макрос RX_D6 и переименованы модули AppUtils и StrUtils. Все. Ничего больше. Никакая старая функциональность не удалена, никакие баги не чинились. Полдня работы. -- Andrey Dementyev, Epsylon Technologies, http://www.epsylontech.com Chief Software Architect Информация от delphiplus ------------------------ 1. C 19-ого декабря компания SGB Software совместно с Ником Ходж (Nick Hodges) из Borland support team займется дальнейшим развитием RxLib. Надеются выпустить 3-ю версию к середине марта 2002 года. Все желающие могут принять участие в этой работе, для этого достаточно написать на RxLIb@SGBSoftware.com. 2. На DelphiPlus выложен материал "A где сейчас RXLib?" - заметка написанная по материалам переписки в эхе fido7.ru.delphi. ------------------------------------------------------------ Q-93: Как вывести ProgresBar на StatusBar? ------------------------------------------------------------ --- Андрей Барташ Gauge:=TGauge.Create(Form1); Gauge.Parent:= StatusBar1; Gauge.Top:=4; Gauge.Left := 116; Gauge.Height := 15; Gauge.Width := 200; Компонент TGauge находится на закладке Samples ------------------------------------------------------------ Q-94: Как нажать клавиши в другом приложении? ------------------------------------------------------------ "Нажимаем" клавиши в Блокноте (уже запущенном): uses Sendkey; {описан ниже} procedure TForm1.Button1Click(Sender: TObject); var h: HWND; begin h := FindWindow('Notepad', nil); // ищем окно Блокнота SendMessage(h, WM_SYSCOMMAND, SC_HOTKEY, h); // активизируем его PlayKeys(StrToKeys('abcdef')); // нажимаем клавиши SendMessage(Handle, WM_SYSCOMMAND, SC_HOTKEY, Handle); // возвращаем фокус end; Коды vk_ клавиш можно найти в Win32 Programmer's Reference (win32.hlp): Virtual-Key Codes. {В дельфи не описаны коды клавиш ['A'..'Z'] и ['0'..'9'], их получают с помощью Ord, например, Ord('A'), Ord('9')}. Символы из верхнего ряда клавиатуры посылаются с нажатым Shift. Заметим, что символы в локальной кодировке могут быть посланы после переключения кодировки в активном приложении, например, если перключатель (switch) Control-Shift, то это: PlayKeys(Chr(vk_control)+#0+Chr(vk_shift)+#0); {downkey = #0}; --- unit Sndkey.pas --- unit sndkey; interface uses Windows, Messages; const {VK constants missing from windows.pas} VK_SEMICOLON = 186; {;} VK_EQUAL = 187; {=} VK_COMMA = 188; {,} VK_MINUS = 189; {-} VK_PERIOD = 190; {.} VK_SLASH = 191; {/} VK_BACKQUOTE = 192; {`} VK_LEFTBRACKET = 219; {[} VK_BACKSLASH = 220; {\} VK_RIGHTBRACKET = 221; {]} VK_QUOTE = 222; {'} downkey = #0; upkey = Chr(KEYEVENTF_KEYUP); {#2} procedure PlayKeys(const keys: String); function StrToKeys(const s: String): String; {Alt-F4: PlayKeys(Chr(vk_menu)+#0+Chr(vk_f4)+#0+Chr(vk_f4)+#2+Chr(vk_menu)+#2)} {"exit"<return>: PlayKeys(StrToKeys('exit'+chr(vk_return)));} {"EXIT": PlayKeys(Chr(vk_shift)+downkey+StrToKeys('exit')+Chr(vk_shift)+upkey));} {or short form: PlayKeys(Chr(vk_shift)+#0+StrToKeys('exit'));} implementation function StrToKeys; {keystroke for alone keys} var i: Longint; c: Char; begin for i := 1 to Length(s) do begin c := s[i]; if c in ['a'..'z'] then {Upper} c := Chr(Ord(c) and not $20); Result := Result + c + downkey + c + upkey; end; end; procedure PlayKeys; const ExtendedKeys : set of byte = [ vk_up, vk_down, vk_left, vk_right, vk_home, vk_end, vk_prior, vk_next, vk_insert, vk_delete]; var i, ips : Longint; fb, sb: Byte; keysdown: String; procedure keybd (vk, kp : Byte); begin if vk in ExtendedKeys then kp := kp + KEYEVENTF_EXTENDEDKEY; keybd_event(vk, MapVirtualKey(vk, 0), kp, 0); end; begin keysdown := ''; for i := 1 to Length(keys) div 2 do begin fb:= Ord(keys[2*i -1]); sb:= Ord(keys[2*i]); if sb = Ord(downkey) then keysdown := keysdown + Chr(fb) else begin ips := pos(Chr(fb), keysdown); if ips > 0 then Delete(keysdown, ips, 1) else Continue; end; keybd(fb, sb); end; {Autocomplete} for i := 1 to Length(keysdown) do keybd(Ord(keysdown[i]), Ord(upkey)); end; end. --- EOF unit Sndkey.pas --- Leonid Troyanovsky <lv.t@eco-pro.ru> ------------------------------------------------------------ Q-95: Как узнать версию Windows? ------------------------------------------------------------ type TWinVersion = (wvUnknown,wv95,wv98,wvME,wvNT3,wvNT4,wvW2K,wvXP); function DetectWinVersion : TWinVersion; var OSVersionInfo : TOSVersionInfo; begin Result := wvUnknown; OSVersionInfo.dwOSVersionInfoSize := sizeof(TOSVersionInfo); if GetVersionEx(OSVersionInfo) then begin case OSVersionInfo.DwMajorVersion of 3: Result := wvNT3; 4: case OSVersionInfo.DwMinorVersion of 0: if OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then Result := wvNT4 else Result := wv95; 10: Result := wv98; 90: Result := wvME; end; 5: case OSVersionInfo.DwMinorVersion of 0: Result := wvW2K; 1: Result := wvXP; end; end; end; end; function DetectWinVersionStr : string; const VersStr : array[TWinVersion] of string = ( 'Unknown', 'Windows 95', 'Windows 98', 'Windows ME', 'Windows NT 3', 'Windows NT 4', 'Windows 2000', 'Windows XP'); begin Result := VersStr[DetectWinVersion]; end; procedure TForm1.Button1Click(Sender: TObject); begin Ver := DetectWinVersion; Label1.Caption := IntToStr(Ord(DetectWinVersion)); Label2.Caption := DetectWinVersionStr; end; Дополнительную информацию можно посмотреть в fido7.ru.delphi FAQ, тема Q79 - "Как узнать версию Windows?" Анатолий Подгорецкий
Секция 2 из 3 - Предыдущая - Следующая
Вернуться в раздел "Языки Pascal/Delphi" - Обсудить эту статью на Форуме |
Главная - Поиск по сайту - О проекте - Форум - Обратная связь |