Главная > Программирование > Языки Pascal/Delphi > |
RU.DELPHI FAQ |
Секция 2 из 5 - Предыдущая - Следующая
Все секции
- 1
- 2
- 3
- 4
- 5
------------------------------------------------------------ Q-25: Как сделать так, чтобы программу можно было запустить только в одном экземпляре? ------------------------------------------------------------ Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для завершения второго экземпляра используйте Application.Terminate. (AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция IsMonitorRunning(). ------------------------------------------------------------ Q-26: Как мне вывести какое-нибудь окошко с картинкой, пока программа грузится? ------------------------------------------------------------ Смотрите пример в X:\DELPHI\DEMOS\DB\MASTAPP\mastapp.dpr. Удобно использовать функцию ShowSplashWindow из rxLib. ------------------------------------------------------------ Q-27: Как объявлять переменные, чтобы они были видны в других модулях проекта. ------------------------------------------------------------ Лучше всего создать отдельный модуль для таких переменных, назвать его скажем ComVars.pas и подключать его в остальных модулях. unit ComVars; interface var MyVar : Integer implementation end. Кроме этого модуля полезно создать еще два ComConst - для общих констант ComUtils - для общих процедур ------------------------------------------------------------ Q-28: А как поместить свою иконку на taskbar, там где часы и переключатель клавиатуры? ------------------------------------------------------------ (Этот вопрос получил первый приз). В библиотеке rxLib есть компонент TrxTrayIcon. Заметьте, что для корректного завершения работы операционной системе вам потребуется обрабатывать сообщение WM_QUERYENDSESSION. ------------------------------------------------------------ Q-29: Как форматировать денежные суммы, чтобы было видно всегда два знака после запятой ------------------------------------------------------------ Использовать для форматирования фунцию FormatFloat('0.00',Variable) для переменных типа Float Для переменных типа Currency функцию CurrToStrF Для полей таблиц базы данных можно использовать свойство DisplayFormat Олег Степанов ------------------------ Можно использовать переменную CurrencyDecimals := 2; Особенно помогает в Win95, где в установках по умолчанию обычно нет копеек (их в те времена и не было в России ;-). Это IMHO проще, чем заставлять юзера править настройки системы или самому извращаться с FormatFloat при каждом выводе на экран ;-) ------------------------------------------------------------ Q-30: Как сделать плавно изменяющийся цвет заголовка окна, как в MSOffice'95? ------------------------------------------------------------ В rxLib есть TGradientCaption. ------------------------------------------------------------ Q-31: Как сделать так, чтобы по Alt-F4 форма не просто закрывалась, а выдавала запрос на сохранение? ------------------------------------------------------------ Обрабатывать OnCloseQuery. CanClose := Application.MessageBox('Закрыть программу?', 'Запрос', MB_OKCANCEL + MB_DEFBUTTON1) <> IDOK; +++++++++++++++++++++++++++++++ procedure TForm1.WMQueryEndSession; // message WM_QUERYENDSESSION; {расскоментировать // message .. в объявлении TForm1} begin FReason := 1; // поле формы : Longint; msg.Result := LParam(True); end; procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if (FReason = 0) then case Application.MessageBox( 'Сохранить данные?', 'Запрос', MB_YESNOCANCEL + MB_DEFBUTTON1) of mrYes: FReason := 2; mrNo: ; mrCancel: CanClose := False; end; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin case FReason of 0: {сохранение не требуется} ; 1: {завершение сессии} ; 2: DoSaveData (..) ; end; end; Leonid Troyanovsky <lv.t@eco-pro.ru> ------------------------------------------------------------ Q-32: Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот? ------------------------------------------------------------ CharToOEM, OEMToChar, CharToOEMBuff, OEMToCharBuff. 1. if S <> '' then CharToOem(PChar(S),PChar(S)); 2. CharToOem(Pointer(S),Pointer(S)); Примечания: 1. Не стоит вызывать эту функцию если S = '' будет ошибка, второй вариан не имеет этой ошибки. 2. Заметьте однако, что эти функции не умеют делать таких, вещей, как koi8-r в DOS и т. п. 3. Не стоит использовать эту функцию также для преобрахования из русской кодировки DOS в русскую Windows и обратно, так как это не преобразование по русскому алфавиту а перекодирова именно из DOS в Windows, то есть на основе текущей локализации системы, если нужна абсоютная гарантия, то следует вопользоваться перекодировкой по таблице, рекомендуется по полной таблице из всех 256 символов, на моей странице (http://podgoretsky.com) есть универсальная функция перекодировки (CharCvt) с набором некоторых основных таблицю ------------------------------------------------------------ Q-33: Кaк yзнaть кaкиe фyнкции нaхoдятcя в DLL и кaк их иcпoльзoвaть? ------------------------------------------------------------ Леонид Трояновский %delphi%\bin\tdump.exe MS Quick View Если без документации, в слепую - не получится. Еще надо знать параметры и возвращаемый результат. Если заголовок есть, он описывается в разделе implementation как external. Обычно библиотеки используют соглашение stdcall. (реже cdecl, дельфийские - register). ------------------------------------------------------------ Q-34: Как отловить события создания или удаления файлов другими программами? ------------------------------------------------------------ В rxLib есть TrxFolderMonitor. (Win16) FileCDR, но она плохо документирована. ------------------------------------------------------------ Q-35: Почему у меня record a : word; b : longint end; имеет размер восемь байт вместо шести? ------------------------------------------------------------ Если не использовать ключевое слово packed, то Дельфи производит выравнивание структуры на определенную границу. В разных версиях Дельфи по разному. Для того что избежать этого, надо описать структуру следующим образом: aRec = packed record a : Word; b : LongInt; end; Также не стоит использовать фундаментальные типы, так как их размерность зависит от версии Дельфи. ------------------------------------------------------------ Q-36: Не перерисовываются окна во время длинного цикла ------------------------------------------------------------ Моя программа довольно долго делает какую-то полезную работу, типа чтения дерева каталогов или обильных вычислений, и в этот момент почти не работают остальные программы. Как разрешить им это делать? Application.ProcessMessages. (AA): Если вы хотите отдавать timeslices в нитях, пользуйтесь Sleep(0); это отдаст остаток слайса системе. (Win16) Если вы хотите разрешить отработку сообщений другим программам, но не вашей, то лучше пользоваться Yield(). ------------------------------------------------------------ Q-37: Как отследить "уход" курсора мыши с компоненты? ------------------------------------------------------------ Надо обрабатывать события CM_MOUSEENTER/CM_MOUSELEAVE. ------------------------------------------------------------ Q-38: Как мне запустить какую-нибудь программу ------------------------------------------------------------ Как мне запустить какую-нибудь программу? А как подождать, пока эта программа не отработает? Как выяснить, работает ли программа или уже завершилась? Как принудительно закрыть выполняющуюся программу? WinExec() или ShellExecute. Первая оставлена для совместимости с Win 3.1, у второй к тому же больше возможностей. uses ShellApi; ShellExecute(Handle,'Open','c:\path\prog.exe',nil,nil,SW_SHOWNORMAL) Последний параметр функции описан в Win32.hlp Анатолий Подгорецкий -------------------------- (SO): CreateProcess() в параметре process info возвращает handle запущенного процесса. Вот и делаешь WaitForSingleObject(pi.hProcess, INFINITE); (AA): (Win16) Delay можно взять из rxLib. handle := WinExec(...); if handle >= 32 then while GetModuleUsage(handle) > 0 do Delay( nn ); else raise .... (AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(), параметр lpExitTime. (Win32) Для принудительного завершения процесса -- TerminateProcess. (Win16) (RR): Надо послать программе сообщение WM_QUIT: Handle := Winexec(App, 0); PostMessage(Handle, WM_QUIT, 0, 0); ------------------------------------------------------------ Q-39: Как правильно закрыть и удалить форму? ------------------------------------------------------------ Как правильно закрыть и удалить форму? Почему моя MDI Child форма при закрывании просто минимизируется? Обрабатывайте событие OnClose для формы и выставляйте в нем параметр Action в caFree. Дело в том, что его значение по умолчанию для MDI Child форм caMinimize. Кстати, если сделать Action := caNone, то форму нельзя будет закрыть. ------------------------------------------------------------ Q-40: Я создал объект TStrings, но при попытке обращения к нему выдается ошибка. ------------------------------------------------------------ TStrings -- это базовый класс. Вам нужен TStringList. ------------------------------------------------------------ Q-41: Мне надо добавить много строк в TListbox или в TCombobox или в TMemo ------------------------------------------------------------ Мне надо добавить много строк в TListbox или в TCombobox или в TMemo или в TRichEdit, при этом сам объект постоянно мигает, перерисовываясь. Как избавиться от этого? BeginUpdate/EndUpdate. ------------------------------------------------------------ Q-42: Как правильно создавать компоненты в run-time? ------------------------------------------------------------ Как правильно создавать компоненты в run-time? Что задавать в качестве параметра Owner при создании компоненты? Как обрабатывать события от созданных компонент, типа нажатий на кнопки? Начнем с создания. Сущность свойства Owner в том, что владелец перед смертью уничтожает (через Free) принадлежащие ему объекты. Таким образом, все зависит от того, кому вы хотите доверить уничтожение созданных форм/компонентов. В частности, если вы сами будете этим заниматься, то AOwner может быть, например, nil. Для того, чтобы созданный компонент появился на экране, надо указать его родителя, заполнив свойство Parent, например, NewButton.Parent := Form1; Пример кода, обрабатывающего события от свежесозданных компонентов: type TForm1 = class(TForm) { ... } private { эта процедура будет вызываться при нажатии на кнопку } procedure ButtonClicked(Sender : TObject); public { в этой процедуре происходит создание кнопки } procedure CreateButton; end; { ... } procedure TForm1.CreateButton; var btn : TButton; begin btn := TButton.Create(Self); // Уничтожать кнопку будет форма btn.Parent := Self; // Родителем кнопки будет форма btn.OnClick := ButtonClicked; // Процедура, которая будет исполняться при btn.Visible := true; // нажатии на кнопку end; ------------------------------------------------------------ Q-43: Как мне запрограммировать непрямоугольную форму, например, как у Norton CrashGuard, в форме щита? ------------------------------------------------------------ SetWindowRgn() (Win32). ------------------------------------------------------------ Q-44: Как использовать свои курсоры в программе? ------------------------------------------------------------ {$R CURSORS.RES} const crZoomIn = 1; crZoomOut = 2; Screen.Cursors[crZoomIn] := LoadCursor(hInstance, 'CURSOR_ZOOMIN'); Screen.Cursors[crZoomOut] := LoadCursor(hInstance, 'CURSOR_ZOOMOUT'); С вашей программой должен быть слинкован файл ресурсов, содержащий соответствующие курсоры. ------------------------------------------------------------ Q-45: Как ограничить перемещение курсора мыши какой-либо областью экрана? ------------------------------------------------------------ ClipCursor(). Учтите, что использование этой функции -- плохой тон. ------------------------------------------------------------ Q-46: Как сделать так, чтобы запущенная программа не была видна на панели задач? ------------------------------------------------------------ Во-первых, можно по примеру Back Orifice воспользоваться функцией RegisterServiceProcess (только для Win9x). Во-вторых, предположим, вы пользуетесь компонентой TrxTrayIcon из rxLib, иначе непонятно, как вы будете возвращать программу обратно из минимизированного состояния. (EM, DS): type TForm1 = class(TForm) Label1: TLabel; RxTrayIcon1: TRxTrayIcon; procedure FormCreate(Sender : TObject); procedure RxTrayIcon1DblClick(Sender: TObject); private procedure ApplicationMinimize(Sender : TObject); procedure ApplicationRestore(Sender : TObject); end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMinimize := ApplicationMinimize; Application.OnRestore := ApplicationRestore; ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationMinimize(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationRestore(Sender : TObject); begin ShowWindow(Application.Handle, SW_RESTORE); end; procedure TForm1.RxTrayIcon1DblClick(Sender: TObject); begin Application.Restore; Application.BringToFront; end; (AK): Только сpазу предупреждаю про грабли, на которые я наступал -- будь готов к тому, что если пpи попытке закрытия приложения в OnCloseQuery или OnClose выводится вопрос о подтверждении, то могут быть проблемы с автоматическим завершением пpогpаммы пpи shutdown -- под Win95 просто зависает, под WinNT не завершается. Очевидно, что сообщение выводится, но его не видно (причем SW_RESTORE не сpабатывает). Решение -- ловить WM_QUERYENDSESSION и после всяких завеpшающих действий и вызова CallTerminateProcs выдавать Halt. ------------------------------------------------------------ Q-47: Как из программы переключить раскладку клавиатуры? ------------------------------------------------------------ ActivateKeyboardLayout(). Учтите, что использование этой функции -- плохой тон. ------------------------------------------------------------ Q-48: Как получить короткий путь файла если имеется длинный? ------------------------------------------------------------ GetShortPathName() ------------------------------------------------------------ Q-49: String в PChar и обратно ------------------------------------------------------------ Для этого достаточно приведения StringVar := String(PCharVar); PCharVar := PChar(StringVar); Предупреждение: Проявляйте максимум острожности, не меняйте содержимое StringVar, так как при этом PCharVar будет указывать уже на недействительный адрес. ------------------------------------------------------------ Q-50: Как при наведении курсора на кнопку менять ее цвет? ------------------------------------------------------------ type TForm1 = class(TForm) BitBtn1: TBitBtn; procedure FormCreate(Sender: TObject); private procedure NewBtnWindowProc(var Msg:TMessage); // Это новый обработчик end; var Form1: TForm1; implementation {$R *.DFM} var OldBtnWindowProc : TWndMethod; procedure TForm1.NewBtnWindowProc; begin case msg.Msg of CM_MOUSELEAVE: BitBtn1.Font.Color := clGray; CM_MOUSEENTER: BitBtn1.Font.Color := clBlack; end; OldBtnWindowProc(Msg); end; procedure TForm1.FormCreate(Sender: TObject); begin OldBtnWindowProc := BitBtn1.WindowProc; BitBtn1.WindowProc := NewBtnWindowProc; BitBtn1.Perform(CM_MOUSELEAVE,0,0); // Изначально серый end; ------------------------------------------------------------ Q-51: Как написать сервис для Windows NT? ------------------------------------------------------------ В поставке Delphi 4 есть пример. http://www.sawatzki.de. ------------------------------------------------------------ Q-52: Как работать с реестром? ------------------------------------------------------------ uses TRegistry Begin with TRegistry.Create; try OpenKey('\Sotware\FirmName\ProgName\Version',True); WriteInteger('Count',Count); finally Free end; end; ------------------------------------------------------------ Q-53: Как выдвинуть дверцу CD-ROM'а? ------------------------------------------------------------ procedure EjectCDROM(aLetter : char); const AliasName = 'MyCoolCdrom'; var s : string; begin s := 'open ' + aLetter + ': type cdaudio alias ' + AliasName + aLetter + ' shareable wait'; if mciSendString(PChar(s), nil, 0, 0) <> 0 then exit; // fails to open try s := 'set ' + AliasName + aLetter + ' door open wait'; mciSendString(PChar(s), nil, 0, 0); finally s := 'close ' + AliasName + aLetter + ' wait'; mciSendString(PChar(s), nil, 0, 0); end; end; ------------------------------------------------------------ Q-54: Как перехватывать клавиши, нажатые в окне другой программы? И вообще, любые события ------------------------------------------------------------ SetWindowsHookEx(). ------------------------------------------------------------ Q-55: Как сделать индикатор прогресса для длительного запроса? ------------------------------------------------------------ Так как оценить объем запроса до его выполнения сложно, то совсем непросто придумать (и сделать) что-то лучше, чем показать пользователю TAnimate. Однако, чтобы показывать что-либо при большом запросе придется выполнять запрос в потоке. См. пример %delphi%\demos\db\bkquery ------------------------------------------------------------ Q-56: Как вызывать из 32-битной программы 16-битные DLL? ------------------------------------------------------------ Надо применять так называемые "thunks". Смотри статьи на http://www.thedelphimagazine.com/samples/thunk/thunk95.htm ------------------------------------------------------------ Q-57: Как получить набранный в Блокноте текст в свою пpогpаммку? ------------------------------------------------------------ function GetWindText(AHandle: THandle): String; var cb : DWord; begin cb := SendMessage(AHandle, WM_GETTEXTLENGTH, 0, 0); SetLength(Result, cb); if cb > 0 then SendMessage(AHandle, WM_GETTEXT, cb+1, LParam(@Result[1])); end; procedure TForm1.Button1Click(Sender: TObject); var AHandle: THandle; begin AHandle := FindWindow('Notepad', nil); Win32Check(AHandle <> 0); AHandle := FindWindowEx(AHandle, 0, 'Edit', nil); Win32Check(AHandle <> 0); Memo1.Text := GetWindText(AHandle); end; ------------------------------------------------------------ Q-58: Как скопировать экран в буфер обмена? ------------------------------------------------------------ keybd_event(VK_SNAPSHOT, MapVirtualKey(VK_SNAPSHOT, 0), 0, 0); keybd_event(VK_SNAPSHOT, 0, 0, 0); ------------------------------------------------------------ Q-59: Где взять подробную документацию по работе с RTF, TRichEdit? ------------------------------------------------------------ В MSDN. В rxLib 2.60 появился компонент TrxRichEdit, полностью поддерживающий MS RichEdit 2.0 и его DB-aware версия. Рекомендуется. ------------------------------------------------------------ Q-60: Как показать Hint для MenuItem? ------------------------------------------------------------ Нint, назначенный Item, можно показать в Statusbar: procedure TForm1.AppHint(Sender: TObject); begin StatusBar1.SimpleText := Application.Hint; end; procedure TForm1.FormCreate(Sender: TObject); begin Application.OnHint := AppHint; end; ------------------------------------------------------------ Q-61: Как можно перетаскивать форму не только за заголовок? ------------------------------------------------------------ type TForm = class(TForm) private procedure NCHitTest(var WMNCMsg: TWMNCHitTest); message WM_NCHITTEST; end; .... procedure TForm1.NCHitTest(var WMNCMsg: TWMNCHitTest); begin inherited; with WMNCMsg do if Result = HTClient then Result:= HTCaption; end; Ilya Katargin <Ilya.Katargin@f9.n5029.z2.fidonet.org> ---------------------------------------------------------------------------- Ещё один метод пеpетаскивания фоpмы не только за заголовок, а вообще за любой компонент, коду значительно меньше, и он пpоще. procedure TForm1.Form1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin ReleaseCapture; Perform (WM_SYSCOMMAND,SC_MOVE+2,0); end; Этот кусочек соpца надо подцеплять в обpаботчик OnMouseDown контpола, за котоpый будем таскать. GauSS aka Gusev Andrey. ------------------------------------------------------------ Q-62: Как сделать прозрачным фон при выводе Canvas.TextOut? ------------------------------------------------------------ Canvas.Brush.Style := bsClear; ------------------------------------------------------------ Q-63: Как применить изменение в реестре без перезагрузки компьютера? ------------------------------------------------------------ Многие программы могут откликнуться на: SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, ..) в Win9х SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, ..) в NT ------------------------------------------------------------ Q-64: Как добавить пункты в системное меню окна? ------------------------------------------------------------ Получить хэндл системного меню окна можно с помощью функции GetSystemMenu(). ------------------------------------------------------------ Q-65: Как в Мемо установить карет в нyжнyю позицию? ------------------------------------------------------------ with Memo do SelStart := Perform(EM_LINEINDEX, LineIndex, 0) + CharIndex; PS: карет - это специальный указатель позиции ввода следующего символа, не путать с курсором мышки. ------------------------------------------------------------ Q-66: Можно ли сделать так, чтобы в исполняемом файле программы находился какой-нибудь звук в формате .wav ------------------------------------------------------------ Можно ли сделать так, чтобы в исполняемом файле программы находился какой-нибудь звук в формате .wav, и можно было бы проиграть этот звук? В файл MyWave.rc пишешь: MyWave RCDATA LOADONCALL MyWave.wav brcc32.exe MyWave.rc, получаешь MyWave.res. В своей программе пишешь: {$R MyWave.res} Все! Предупреждая следующий твой вопрос "а как прочитать wave-файл из исполняемого файла?" procedure RetrieveMyWave; var hResource: THandle; pData: Pointer; begin hResource:=LoadResource( hInstance, FindResource(hInstance, 'MyWave', RT_RCDA TA)); try pData := LockResource(hResource); if pData = nil then raise Exception.Create('Cannot read MyWave'); // Здесь pData указывает на MyWave // Теперь можно, например, проиграть его (Win32): PlaySound(pData, 0, SND_MEMORY); finally FreeResource(hResource); end; end; +++++++++++++++++++++++++++++++++ PlaySound('RESNAME', 0, SND_MEMORY or SND_RESOURCE); Для этого надо создать файл описания ресурса, например Waves, в который поместить следующие строки: SOUND1 WAVE WMyWave1.wav SOUND2 WAVE WMyWave2.wav Затем запустить ресурс на компилияцию brcc32.exe Waves.rc, в результате получится файл ресурса Waves.res. В своей программе подключаем ресурс (в любом модуле): {$R Waves.res} Для проигрывания звука можно использольвать функцию PlaySound PlaySound('SOUND1', 0, SND_ASYNC or SND_RESOURCE); Anatoly Podgoretsky +++++++++++++++++++++++++++++++++++++++++ если Delphi 5, то можно .rc прямо в проект включать Олег Степанов: ------------------------------------------------------------ Q-67: Как сделать в меню список последних открытых файлов? ------------------------------------------------------------ Пусть список файлов хранится в FileList : TStringList, a mmReopen : TMenuItem - пункт меню, содержащий ссылки на файлы, тогда при изменениии списка файлов надо сделать: {var NewItem: TMenuItem} for I := mmReopen.Count -1 downto 0 do begin mmReopen.Delete(I); end; for I := 0 to lf.Count-1 do begin NewItem := TMenuItem.Create(mmReopen); NewItem.Caption := '&'+IntToStr(I) + ' ' + FileList.Strings[I]; NewItem.OnClick := FileOpenProc; mmReopen.Add(NewItem); end; ... procedure FormX.FileOpenProc(Sender : TObject); var Filename : String; begin Filename := FileList.Strings[mmReopen.IndexOf(TMenuItem(Sender))]; ... end; ------------------------------------------------------------ Q-68: Как узнать и поменять разрешение экрана? ------------------------------------------------------------ Поменять: procedure ChangeDisplayResolution(x, y : word); var dm : TDEVMODE; begin ZeroMemory(@dm, sizeof(TDEVMODE)); dm.dmSize := sizeof(TDEVMODE); dm.dmPelsWidth := x; dm.dmPelsHeight := y; dm.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT; ChangeDisplaySettings(dm, 0); end; Узнать можно также с помощью объекта Screen Screen.Width Screen.Height ------------------------------------------------------------ Q-69: Какое событие происходит при минимизации окна? ------------------------------------------------------------ OnResize Для MainForm : Application.OnMinimize ------------------------------------------------------------ Q-70: Как во время выполнения программы создать так называемый "array of const" ------------------------------------------------------------ В библиотеке Technical Information на сайте Inprise есть документ за нумером TI582D.txt, посвященный этой проблеме. Вкратце, в качестве array of const можно использовать массив типа TVarRec. ------------------------------------------------------------ Q-71: Как сохранить в 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-72: Как обратиться к определенному адресу физической памяти? ------------------------------------------------------------ Как обратиться к определенному адресу физической памяти? А как прочитать значение из порта? Где мой любимый массив Port[]? Прочитайте какую-нибудь книжку про программирование под Win32. Вкратце -- забудьте про все эти глупости. P.S. Q155 содержит несколько методов работы с портами, как легальных, так и не вполне. В статье также содержится несколько ссылок на наиболее известные драйвера. ------------------------------------------------------------ Q-73: Как закрыть внешнюю программу? ------------------------------------------------------------ Например, Блокнот можно закрыть так: 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-74: Как загрузить из ImageList иконку приложения? ------------------------------------------------------------ ImageList1.GetIcon(Idx, Application.Icon); ------------------------------------------------------------ Q-75: Как использовать в качестве обработчика сообщения обычную процедуру, а не метод объекта? ------------------------------------------------------------ У этой процедуры должен быть еще один дополнительный параметр. В метод класса кpоме паpаметpов, обьявленных в заголовке, пеpедаётся ещё паpаметp Self procedure MyRegularProc(ASelf, Sender: TObject); begin ShowMessage(ASelf.ClassName + ' ' + Sender.ClassName); end; procedure TForm1.Button1Click(Sender: TObject); var amethod: TMethod; begin amethod.Code := @MyRegularProc; amethod.Data := Self; Button1.OnClick := TNotifyEvent(amethod); end; Leonid Troyanovsky <lv.t@eco-pro.ru> ------------------------------------------------------------ Q-76: Как отловить нажатие 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-77: В какой позиции Memo находится каретка? ------------------------------------------------------------ var LineNum, Charnum: Integer; .... LineNum := Memo1.Perform(EM_LINEFROMCHAR, -1, 0); CharNum := Memo1.Perform(EM_LINEINDEX, LineNum, 0); ------------------------------------------------------------ Q-78: Как работать с графическими форматами, хотя бы самыми известными? ------------------------------------------------------------ На [32]http://www.imagelib.com лежит библиотека ImageLib. На компакте с Delphi 3 в каталоге EXTRAS есть библиотека JPEG. Если сказать в модуле uses jpeg; то можно работать с .jpg как с TPicture. Еще есть freeware-библиотека Nishita ViewLib. JPG, JFIF, GIF, BMP, DIB, RLE, TGA, PCX. http://einstein.ae.eng.ua.edu/nishita/index.htm. ------------------------------------------------------------ Q-79: Почему после RichEdit1.Lines.SaveToFile(name) в файле, кроме моего текста, ещё всякий бред написан? ------------------------------------------------------------ Таким образом в RTF сохраняется информация об оформлении текста. Если сохранять нужно только текст, перед записью сделай RichEdit1.PlainText := True; ------------------------------------------------------------ Q-80: Как работать с файлами архивов, хотя бы самыми распространенными? ------------------------------------------------------------ Воспользуйтесь библиотекой ExceedZip 3.0 (http://www.exceedsoft.com). ------------------------------------------------------------ Q-81: Как вставить картинку в TDrawGrid?
Секция 2 из 5 - Предыдущая - Следующая
Вернуться в раздел "Языки Pascal/Delphi" - Обсудить эту статью на Форуме |
Главная - Поиск по сайту - О проекте - Форум - Обратная связь |