Наконец-то дошли руки до написания FAQ-шки. Выставляю на ваше обозрение. Точнее она у меня уже давно. Я ее делал для себя, но потом понял, что такое достояние нельзя хранить только у себя, а надо делиться. Вот я и сел из текстовика переделывать в HTML-ину. Вопросы, на которые пока нет ссылки, скоро появятся. Я просто еще не успел их переделать из текстовика. Приятно почитать. Что не найдете, пишите мне, постараюсь ответить. И ваш вопрос так же будет помещен сюда.
Как узнать, активна ли программа?
Как установить время, через которое появится подсказка?
Как установить время, через которое исчезнет подсказка?
Как поменять ярлык приложения в TaskBar?
Как изменить заголовок приложения в панели задач?
Как максимизировать приложение?
Как минимизировать приложение?
Как заставить программу обрабатывать сообщения?
Как предпочтительней закрыть программу?
Какое событие совершается при появлении исключительной необработанной ситуации.
Какое событие cовершается при выводе подсказки "на лету"?
Как заставить открываться только один экемпляр программы?
Как активизировать существующую копию программы.
Как заставить мышку двигаться?
Как найти окно другой программы?
Как переместить окно чужой программы?
Как узнать хэндл окна, находящегося в данной точке?
Как установить окно в новую позицию?(способ 2)
Как узнать хэндл Рабочего Стола?
Как программно выключить монитор?
Как создать мигающий заголовок (пикторгамму) окна?
Какой самый быстрый способ очистки canvas'а?
Как спрятать и отключить кнопку Пуск?
Как временно отключить перерисовку окна?
Можно ли отключить кнопку закрытия любого окна?
Как узнать путь к каталогам Windows?
Как сделать родительское окно с рисунком в клиентской области?
Как запускать свою программу при каждом старте Windows?
Как очистить пункт Документы меню кнопки Пуск?
Как узнать является диск CD-диском, сетевым диском, вируальным диском или съемным диском?
Как получить хэндл Панели Задач(TaskBar)?
Как с помощью Проводника открыть конкретный каталог?
Как запустить из Delphi приложение?
Как открыть URL броузером, установленным по умолчанию?
Как стереть exe-файл во время его исполнения?
Как выяснить положение курсора в Memo?
Как хзнать, находится ли дискета в дисководе?
Как заставить формуляр не разворачиваться из пиктограммы?
Как обработать MessageDlg с тремя кнопками?
Как из Delphi создать документ Word?
Какие функции есть для работы с документами Word из Delphi?
При активном состоянии программа имеет свойство
Application.Active:=True;
Время в миллисекундах, после которого появится подсказка "на лету".
Application.HintPause;
Время в миллисекундах, после которого подсказка исчезнет.
Application.HintHidePause;
Изменение иконки окна программы.
Application.Icon.LoadfromFile('abc.ico');
Заголовок приложения в панели задач
Application.Title;
Максимизирование окна приложения.
Application.Minimize;
Минимизирование окна приложения.
Application.Maximize;
Программа при выполнении какого-либо цикла получает возможность попутно обрабатывать "внешние" сообщения
Application.ProcessMessages;
Предпочтительный способ закрытия программы
Application.Terminatec;
Cобытие, которое вызывается при исключительной необработанной ситуации
OnException;
Событие при выводе подсказки на лету
OnHint;
Свойства TScreen
ActiveControl
Это свойство возвращает объект TWinControl, имеющий фокус ввода. Обычно оно используется для реализации команд Copy, Cut и Paste для текстовых управляющих элементов. Следующий код, помещенный в обработчик TMenuItem, выполняет функцию Copy.
procedure TFormI.mnuEditCopyClick(Sender: TObject);
begin
Screen.ActiveControl.Perform(WM_COPY,0,0);
end;
Все, что происходит в мире Windows, базируется на сообщениях. Для выполнения какой-либо функции управляющие элементы часто отсылают сообщения самим себе. Так и в этом примере управление происходит путем передачи сообщения WM_COPY.
Height и Width
Это наиболее полезные свойства, возвращающие высоту и ширину экрана в пикселях. Они могут применяться во многих ситуациях, например при определении местоположения формы. Вот как поместить форму в центре экрана.
Left:= (Screen.Width - Width) div 2; Top:= (Screen.Height - Height) div 2;
Чтобы передать фокус какому-нибудь объекту надо написать
Object.SetFocus;
Выделить весь текст
Edit1.SelectAll;
Открытие только одного экземпляра программы
begin
Application.Initialize;
if FindWindow('TFormi','Formi') о 0 then Application.Terminate;
Application.Create Form(TForm1,Form1);
Application.Run;
end.
Активизирование существующей копии
Все-таки, сказать пользователю "Ты уже запустил одну копию, теперь иди и ищи ее!"— как-то негуманно... Более профессиональным решением будет активизировать существующую копию с помощью другой функции Windows API — SetForegroundWindow. Измените проект следующим образом.
var
hwndPrev: HWND;
begin
Application.Initialize;
hwndPrev:= FindWindow('TFormi','Formi');
if hwndPrev < 0 then
begin
SetForegroundWindow(hwndPrev);
Application.Terminate;
end;
Application.CreateForm(TFormi,Formi);
Application.Run;
end.
Заставить мышку двигаться можно так
var M: TPoint; begin GetCursorPos(M); SetCursorPos(x, y);
x, y - координаты курсора
Как сделать бегущую стpоку?
C помощью TLabel и TTimer.
procedure TForm1.Timer1Timer(Sender: TObject);
const LengthGoString = 10;
Gostring = 'В конце стpоку желательно повтоpить,'+
' чтоб получить эффект кольцевого движения! В конце ст';
const i: Integer = 1;
begin
Label1.Caption:=Copy(GoString,i,LengthGoString);
Inc(i);
if Length(GoString)-LengthGostring < i then
i:=1;
end;
Функция FindWindow
function FindWindow(className,WindowName : PChar) : HWND;
Функция возвращает описатель окна, удовлетворяющий запросу (0 -если такого окна не найдено).
ClassName - имя класса, по которому призводится поиск среди ВСЕХ окон системы.
WindowName - заголовок окна
Один из параметров может быть равен nil, тогда поиск ведется по другому параметру.
Пример:
...
Var Hwnd1 : HWND;
Begin
Hwnd1:=FindWindow('TForm1',nil);//Поиск окна с именем класса TForm
end;
Функция GetWindowText
function GetWindowText(hWnd: HWND; lpString: PChar; nMaxCount: Integer): Integer;
Функция возвращает текст окна. Для формы это будет заголовок, для кнопки - надпись на кнопке.
hWnd
Описатель того окна, текст которого нужно получить.
lpString
Переменная, в которую будет помещен результат
nMaxCount
Максимальная длина текста, если текст длиннее, то он обрезается.
Пример:
... Var Buff : Array[0..127] of char; s : String; Begin GetWindowText(Form1.Handle,Buff,SizeOf(Buff)); s:=StrPas(Buff); label1.caption:=s; End
Функция SetWindowText
function SetWindowText(hWnd: HWND; lpString: PChar): BOOL;
Устанавливает текст окна.
hWnd
Описатель того окна, текст которого нужно установить
lpString
Строка, содержащая устанавливаемый текст.
Пример:
...
Var Buff : Array[0..127] of char;
Begin
StrPCopy("New Text",Buff);
SetWindowText(form2.button1.handle,Buff);{установить надпись на кнопке Button2 "New Text"}
End;
Функция MoveWindow
MoveWindow(hWnd: HWND; X, Y, nWidth, nHeight: Integer; bRepaint: BOOL): BOOL; Перемещает окно в новую позицию.
hWnd
Описатель перемещаемого окна.
X, Y, nWidth, nHeight
Соответственно: новые координаты X,Y; новая ширина, высота.
bRepaint
Булево значение, показывающее будет ли окно перерисовано заново.
Функция WindowFromPoint
WindowFromPoint(Point: TPoint): HWND;
Возвращает описатель окна, находящегося в данной точке экрана.
Point
Координата точки экрана типа TPoint(определение типа смотри ниже)
Функция ShowWindow
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; Показывает или прячет окно.
hWnd
Описатель нужного окна
nCmdShow
Константа, определяющая, что будет сделано с окном:
SW_HIDE
SW_SHOWNORMAL
SW_NORMAL
SW_SHOWMINIMIZED
SW_SHOWMAXIMIZED
SW_MAXIMIZE
SW_SHOWNOACTIVATE
SW_SHOW
SW_MINIMIZE
SW_SHOWMINNOACTIVE
SW_RESTORE
SW_SHOWDEFAULT
SW_MAX
Пример:
... Begin ShowWindow(Application.Handle,sw_hide);//Будет скрыт значок приложения на панели задач ShowWindow(form1.Handle,sw_hide);//Будет скрыта форма Form1 End; ...
Функция CloseWindow
function CloseWindow(hWnd: HWND): BOOL; stdcall;
Закрывает окно.
hWnd
Описатель закрываемого окна.
Функция SetWindowPos
function SetWindowPos(hWnd: HWND; hWndInsertAfter: HWND; X, Y, cx, cy: Integer; uFlags: UINT): BOOL; stdcall;
Устанавливает окно в новую позицию
hWnd
Описатель окна
hWndInsertAfter
Описатель окна, перед которым в списке Z-Order будет вставлено окно hWnd, или одна из следующих констант:
HWND_BOTTOM
Поместить окно на дно списка Z-Order
HWND_TOP
Поместить окно на верх списка Z-Order
X, Y, cx, cy
Соответственно - новые горизонт. , верт. позиции окна (X, Y), а также новая ширина и высота (cx, cy)
uFlags
Одна или несколько (разделенных OR) следующих констант:
SWP_NOSIZE
Не изменять размер окна после перемещения (cx, cy игнорируются)
SWP_NOZORDER
Не изменять положение окна в списке Z-Order
SWP_SHOWWINDOW
Сделать окно видимым после перемещения
SWP_HIDEWINDOW
Спрятать окно после перемещения
SWP_NOACTIVATE
Не передавать фокус окну после перемещения
SWP_NOMOVE
Не перемещать окно (игнорируется X, Y)
Функция GetDesktopWindow
function GetDesktopWindow: HWND
Функция возвращает описатель окна Рабочего Стола (Desktop). Без параметров.
Как программно выключить монитор?
Программно можно отключить монитор совместимый со стандартом EnergyStar. Отправьте сообщение wm_SysCommand с параметром WParam = SC_MonitorPower
и LParam = 0 для отключения монитора
LParam = 1 для включения монитора
В приведенном примере монитор отключается на 10 секунд.
Пример:
type
TForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
MonitorOff : bool;
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
Timer1.Enabled := false;
Timer1.Interval := 10000;
MonitorOff := false;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if MonitorOff then begin
MonitorOff := false;
SendMessage(Application.Handle,
wm_SysCommand,
SC_MonitorPower,
-1);
Timer1.Enabled := false;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
MonitorOff := true;
Timer1.Enabled := true;
SendMessage(Application.Handle,
wm_SysCommand,
SC_MonitorPower,
0);
end;
Как создать мигающий заголовок окна (пиктограмму)?
Можно воспользоваться функцией API
FlashWindow():Пример:
var Flash : bool; procedure TForm1.Timer1Timer(Sender: TObject); begin FlashWindow(Form1.Handle, Flash); FlashWindow(Application.Handle, Flash); Flash := not Flash; end; procedure TForm1.FormCreate(Sender: TObject); begin Flash := False; end;
Какой самый быстрый способ для очистки canvasа?
Windows API функция
PatBlt().Пример:
procedure TForm1.Button1Click(Sender: TObject); begin PatBlt(Form1.Canvas.Handle, 0, 0, Form1.ClientWidth, Form1.ClientHeight, WHITENESS); end;
Как спрятать и отключить кнопку "Пуск"?
Приведенный пример прячет и показывает кнопку "Пуск", а также разрешает и запрещает ее.
Пример:
procedure TForm1.Button1Click(Sender: TObject); var Rgn : hRgn; begin {Cпрятать кнопку "Пуск"} Rgn := CreateRectRgn(0, 0, 0, 0); SetWindowRgn(FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0, 'Button', nil), Rgn, true); end; procedure TForm1.Button2Click(Sender: TObject); begin {Показать кнопку "Пуск"} SetWindowRgn(FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0, 'Button', nil), 0, true); end; procedure TForm1.Button3Click(Sender: TObject); begin {Запретить кнопку "Пуск"} EnableWindow(FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0, 'Button', nil), false); end; procedure TForm1.Button4Click(Sender: TObject); begin {Разрешить кнопку "Пуск"} EnableWindow(FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0, 'Button', nil), true); end
Как временно отключить перерисовку окна?
Вызовите функцию WinAPI LockWindowUpdate передав ей дескриптор окна, которое необходимо не обновлять. Передайте ноль в качестве параметра для восстановления нормального обновления.
LockWindowUpdate(Memo1.Handle); . . LockWindowUpdate(0);
Можно ли отключить кнопку закрытия любого окна?
Да, приведенный пример отключает кнопку закрытия и пункт "закрыть" ситсемного меню заданного окна.
procedure TForm1.Button1Click(Sender: TObject); var hwndHandle : THANDLE; hMenuHandle : HMENU; begin hwndHandle := FindWindow(nil, 'Untitled - Notepad'); if (hwndHandle 0) then begin hMenuHandle := GetSystemMenu(hwndHandle, FALSE); if (hMenuHandle 0) then DeleteMenu(hMenuHandle, SC_CLOSE, MF_BYCOMMAND); end; end;
Как узнать путь к каталогам Windows?
Следующий пример получает полный список каталогов по умолчанию (Favorites, Desktop, Programs, Fonts, SendTo, Start, Menu, Templates, Startup, Recent and NetHood) Windows и заносит его в Memo.
Пример:
uses Registry; procedure TForm1.Button1Click(Sender: TObject); var reg : TRegistry; ts : TStrings; i : integer; begin reg := TRegistry.Create; reg.RootKey := HKEY_CURRENT_USER; reg.LazyWrite := false; reg.OpenKey( 'Software\Microsoft\Windows\CurrentVersion\ Explorer\Shell Folders', false); ts := TStringList.Create; reg.GetValueNames(ts); for i := 0 to ts.Count -1 do begin Memo1.Lines.Add(ts.Strings[i] + ' = ' + reg.ReadString(ts.Strings[i])); end; ts.Free; reg.CloseKey; reg.free; end;
Как сделать родительское окно с фоновым рисунком в клиентской области?
Для того чтобы сделать это выполните следующие шаги:
Содайте новый проект.
Установите FormStyle формы в fsMDIForm
Разместите Image на форме и загрузите в него картинку.
Найдите { Private Declarations } в обьявлении формы и добаьте следующие строки:
FClientInstance : TFarProc; FPrevClientProc : TFarProc; procedure ClientWndProc(var Message: TMessage);Добаьте следующие строки в разделе implementation:
procedure TMainForm.ClientWndProc(var Message: TMessage); var Dc : hDC; Row : Integer; Col : Integer; begin with Message do case Msg of WM_ERASEBKGND: begin Dc := TWMEraseBkGnd(Message).Dc; for Row := 0 to ClientHeight div Image1.Picture.Height do for Col := 0 to ClientWidth div Image1.Picture.Width do BitBlt(Dc, Col * Image1.Picture.Width, Row * Image1.Picture.Height, Image1.Picture.Width, Image1.Picture.Height, Image1.Picture.Bitmap.Canvas.Handle, 0, 0, SRCCOPY); Result := 1; end; else Result := CallWindowProc(FPrevClientProc, ClientHandle, Msg, wParam, lParam); end; end;В методе формы OnCreate добавьте:
FClientInstance := MakeObjectInstance(ClientWndProc); FPrevClientProc := Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC)); SetWindowLong(ClientHandle, GWL_WNDPROC, LongInt(FClientInstance));Добавьте к проекту новую форму и установите ее свойство FormStyle в fsMDIChild. У Вас получился MDI-проект с "обоями" в клиентской области MDI формы.
Как запускать мою программу на каждом старте Windows?
Пример работает и для Win32и для Win16.
uses Registry, {For Win32} IniFiles; {For Win16} {$IFNDEF WIN32} const MAX_PATH = 144; {$ENDIF} {For Win32} procedure TForm1.Button1Click(Sender: TObject); var reg: TRegistry; begin reg := TRegistry.Create; reg.RootKey := HKEY_LOCAL_MACHINE; reg.LazyWrite := false; reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', false); reg.WriteString('My App', Application.ExeName); reg.CloseKey; reg.free; end; {For Win16} procedure TForm1.Button2Click(Sender: TObject); var WinIni : TIniFile; WinIniFileName : array[0..MAX_PATH] of char; s : string; begin GetWindowsDirectory(WinIniFileName, sizeof(WinIniFileName)); StrCat(WinIniFileName, '\win.ini'); WinIni := TIniFile.Create(WinIniFileName); s := WinIni.ReadString('windows', 'run', ''); if s = '' then s := Application.ExeName else s := s + ';' + Application.ExeName; WinIni.WriteString('windows', 'run', s); WinIni.Free; end;
Как очистить пункт документы меню кнопки Пуск
Вызовите Windows API функцию SHAddToRecentDocs() передав nil вместо имени файла в качестве параметра.
Пример:
uses ShlOBJ; procedure TForm1.Button1Click(Sender: TObject); begin SHAddToRecentDocs(SHARD_PATH, nil); end;
Как узнать является диск CD-диском,сетевым диском, виртуальным диском или сьемным диском?
Windows API функция GetDriveType().
Пример:
procedure TForm1.Button1Click(Sender: TObject); begin case GetDriveType('C:\') of 0 : ShowMessage('The drive type cannot be determined'); 1 : ShowMessage('The root directory does not exist'); DRIVE_REMOVABLE:ShowMessage('The disk can be removed'); DRIVE_FIXED : ShowMessage('The disk cannot be removed'); DRIVE_REMOTE : ShowMessage('The drive is remote (network) drive'); DRIVE_CDROM : ShowMessage('The drive is a CD-ROM drive'); DRIVE_RAMDISK : ShowMessage('The drive is a RAM disk'); end; end;
Как получить дескриптор панели задач (TaskBar)?
hTaskbar := FindWindow('Shell_TrayWnd', Nil )
Как спрятать TaskBar?
Вначале необходимо вызвать функцию FindWindow(), чтобы определить handle TaskBar. Затем вызвите функцию ShowWindow(), передав ей в качестве параметра костанту SW_HIDE.
Пример:
procedure TForm1.Button1Click(Sender: TObject); var hTaskBar : THandle; begin hTaskbar := FindWindow('Shell_TrayWnd', Nil); ShowWindow(hTaskBar, SW_HIDE); end; procedure TForm1.Button2Click(Sender: TObject); var hTaskBar : THandle; begin hTaskbar := FindWindow('Shell_TrayWnd', Nil); ShowWindow(hTaskBar, SW_SHOWNORMAL); end;
Как с помощью Проводника открыть конкретный каталог?
Пример:
uses ShellApi; procedure TForm1.Button1Click(Sender: TObject); begin ShellExecute(0, 'explore', 'C:\WINDOWS', nil, nil, SW_SHOWNORMAL); end;
Запуск приложения
WinExec('C:\WINDOWS\CONTROL.EXE', sw_ShowNormal);
Как открыть URL браузером, установленным по умолчанию?
Используйте функцию ShellExecute.
Пример:
uses ShellAPI; procedure TForm1.Button1Click(Sender: TObject); begin ShellExecute(Form1.Handle, nil, 'http://www.borland.com', nil, nil, SW_SHOWNORMAL); end;
Как стереть ехе-файл во время его исполнения?
Это не возможно. Вы можете стереть его во время следующего запуска Windows, добавив ключ RunOnce: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce
Пример:
uses Registry; procedure TForm1.Button1Click(Sender: TObject); var reg: TRegistry; begin reg := TRegistry.Create; with reg do begin RootKey := HKEY_LOCAL_MACHINE; LazyWrite := false; OpenKey('Software\Microsoft\Windows\CurrentVersion\RunOnce', false); WriteString('Delete Me!','command.com /c del FILENAME.EXT'); CloseKey; free; end; end;
Как выяснить положение курсора в МЕМО?
Необходимо вызвать дважды API-функцию "SendMessage":
var xChr, xRow, xCol: LongInt; ... xRow := SendMessage(Memo1.Handle, EM_LINEFROMCHAR, Memo1.SelStart, 0); xChr := SendMessage(Memo1.Handle, EM_LINEINDEX, Zeile, 0); xCol := Memo1.SelStart - xChr + 1;
Как узнать, находится ли дискета в дисководе?
type TDriveState(DS_NO_DISK, DS_UNFORMATTED_DISK, DS_EMPTY_DISK, DS_DISK_WITH_FILES); function DriveState(DrvLetter: Char): TDriveState; var Mask: String[6]; SearchRec: TSearchRec; oldMode: Cardinal; ReturnCode: Integer; begin oldMode: = SetErrorMode(SEM_FAILCRITICALERRORS); Mask:= '?:\*.*'; Mask[1] := DrvLetter; {$I-} { отключить обработку исключительных ситуаций } ReturnCode := FindFirst(Mask, faAnyfile, SearchRec); FindClose(SearchRec); {$I+} case ReturnCode of { как минимум один файл был найден } 0: Result := DS_DISK_WITH_FILES; { файлов не найдено и дискета в порядке } -18: Result := DS_EMPTY_DISK; { DS_NO_DISK для DOS, ERROR_NOT_READY для WinNT, ERROR_PATH_NOT_FOUND для Win 3.1 } -21, -3: Result := DS_NO_DISK; else { дискета лежит в дисководе но она не форматировнная } Result := DS_UNFORMATTED_DISK; end; SetErrorMode(oldMode); end; { DriveState }
Как "заставить" формуляр не разворачиваться из иконки?
Для этого необходимо перехватить сообщение "WM_QUERYOPEN". Для этого необходимо объявить соответствующую процедуру в private-области.
{ объявление процедуры в классе TMainForm } procedure WMQueryOpen(var Msg: TWMQueryOpen); message WM_QUERYOPEN; { ... и ее реализация } procedure TMainForm.WMQueryOpen(var Msg: TWMQueryOpen); begin Msg.Result := 0; end;
Как обработать MessageDlg с тремя кнопками?
Если в MessageDlg указывается больше двух кнопок, то обрабатывается это так:
CASE MessageDlg('Файл '+ExtractFileName(SaveDialog1.FileName)+' был изменен. Сохранить?', mtConfirmation, mbYesNoCancel, 0) OF idYes : Save1.onClick(Sender); idNo :; idCancel:CanClose:=False;; end;
Для создания документа Microsoft Word из Delphi нужно создать переменную, ассоциированную с Word. Если Word еще не открыт, его нужно открыть.
uses ComObj; procedure TForm1.Button1Click(Sender: TObject); var MSWord: Variant; begin try MsWord := GetActiveOleObject('Word.Application'); except try MsWord := CreateOleObject('Word.Application'); MsWord.Visible := True; except Exception.Create('Error'); end; end; MSWord.Documents.Add; MSWord.Selection.Font.Size := 12; MSWord.Selection.TypeText('Текст'); MSWord.Selection.Font.Bold := true; MSWord.Selection.TypeText(#13#10'new'); MSWord.ActiveDocument.SaveAs('C:\ex.doc'); end;
Это пожалуй единственный вопрос, который я тут объяснять не буду. Все материалы по этому вопросу вы найдете в этом zip-файле.
©Приходько Олег, 2001-2005 г.