Простым решением является «заимствование» модуля Math из пиратской Enterpise-версии, но это, вообще-то, воровство. Самому же создавать матеатическую библитеку с нуля – занятие неблагодарное (по крайней мере достаточно трудоёмкое).
Не работая плотно на MSVC я как-то был не в курсе наличия библиотеки crtdll.dll в Windows (насколько мне удалось выяснить, она таки является частью операционной системы, по крайней мере ставится вместе с Windows 9x/NT/2000). С её помощью можно решить указанную проблему, воспользовавшись готовым решением, а именно – объявить все необходые функции из math.h в своей программе и наслаждаться. :)
Пример с atan2:
functionatan2(x, y: double): Double; stdcall; external'crtdll.dll' name'atan2';
Проверено – работает. Поскольку метод открылся буквально только что, я ещё не успел сделать модуль-обёртку для всех математических функций. Видимо, сделаю и отдам во всеобщее пользование.
Да, в crtdll.dll много фукнций, не связанных с математикой, в частности, если вы в программе используете PChar, то можно воспользоваться набором сишных strcmp, strcpy…, так же доступны isalpha, isdigit…, и, наконец, bsearch и qsort. :)
С уважением,
Марк Шевченко.
Как сказать VCL, чтобы клавиши shortcut пунктов главного меню главной формы действовали только в этой форме (но не в модальных окнах, к примеру)?
Nomadicсоветует:
Знакомая проблема. Лечится так:
functionWindowHook( var Message: TMessage): Boolean;
procedure.FormCreate(Sender: TObject);
begin
// MainForm
Application.HookMainWindow(WindowHook);
function.WindowHook;
begin
Result := False;
with Message do
caseMsg of
CM_APPKEYDOWN, CM_APPSYSCOMMAND : Msg := WM_NULL;
При использовании MS SQL Server 6.5 в NT Performance Monitor исчезли все датчики, кроме SQL
Nomadicсоветует:
Кто виноват:
Дело в следующем – при инсталляции NT страна была поставлена US, затем сменена на Russia. В реестре для Perfomance Monitor существует (может существовать) сколь угодно подуровней с названием счетчиков и описанием к ним. При инсталляции все естестественно ставилось в ветвь 409 (US), а ветви 419 (Russia) просто не было. Потом default location была сделана Russia. Perfomance Monitor не мог найти 419 и брал все счетчики из 409. Hо тут пришел SQL и как умная программа при инсталляции создал ветвь 419 и запихал туда свои счетчики. Теперь Perfomance Monitor видит что текущая locale 419, в реестре она есть и берет оттуда счетчики, а они там только для SQL естественно.
Что делать:
Запускаешь regedit (regedt32), находишь где лежат описания счетчиков. Точно я не помню, под рукой NT нет, но примерно так – HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/PerfLib/409 (419). В каждом разделе по два ключа – список названий счетчиков и список их описаний. Заходишь в 409, открываешь ключ для изменений и при помощи Ctrl-Ins копируешь его содержимое в буфер обмена и жмешь Cancel. Теперь идешь в 419 открываешь тот же ключ, идешь в начало списка и при помощи Shift-Ins вставляешь, жмешь Ok. Так надо сделать и для названий счетчиков и для их описания. Для полного счастья можно и SQL счетчики из 419 в 409 (в конец) скопировать.
Артем Федюкприслал свой сборник любимых функций:
(*
Функции собрал Артем Федюк (Киев, 27.11.2000)E-Mail: xartrain@hotmail.comсообщите, пожалуйста о найденных ошибках*)
{H+}//use huge strings
unitXWindows;
INTERFACE
usesclasses, windows, shellApi, shlobj, sysUtils, forms, mmsystem, controls, Messages, Registry, IniFiles;
{***************************ПРОЦЕССЫ И УПРАВЛЕНИЕ ИМИ**************************}
procedureexecWait( constcomLine: string);
procedureshellExec( constfileName: string);
//также можно использовать Sleep(ms:DWORD);
procedureDelay(msecs : DWORD);
//фактически определяется запущена ли сейчас среда Delphi
functionisDelphiRunning:boolean;
functionRegisterServiceProcess(dwProcessID, dwType: Integer): Integer; stdcall; external'KERNEL32.DLL';
procedureapplicationInCtrlAltDelList(visi:boolean);
procedureapplicationInTaskBar(visi:boolean);
//Запретить/разрешить Ctrl-Alt-Del
procedureCtrlAltDel(state:boolean);
//Окно без закладки в TaskBar
procedurenoAppInTaskbar;
//Определение какие приложения уже запущены
procedureApplicationList(formHandle:THandle; varstringList:TStringList);
{***************************ВРЕМЯ**********************************************}
functionSetTime(DateTime:TDateTime):Boolean;
//обновить часы - SendMessage(HWND_TOPMOST,WM_TIMECHANGE,0,0);
Читать дальше