Главная > Программирование > Языки Pascal/Delphi > |
RU.DELPHI.CHAINIK FAQ |
Секция 3 из 3 - Предыдущая - Следующая
Все секции
- 1
- 2
- 3
------------------------------------------------------------ Q-96: Как использовать в эхотаге API фyнкции ------------------------------------------------------------ AA> как это ни странно, вызывать их. предварительно заюзав модуль windows. Правильнее : вызвать, предварительно подключив модуль, в котором данная функция описана (это может быть windows, activex, shellapi и т.д.). Найти модуль поможет клавиша F1 на имени функции. Если функция не нашлась - то попробовать сделать поиск в папке с исходными текстами Дельфи. Если функция не нашлась - есть шанс, что в этой версии Дельфи она не описана. В этом случае надо поискать "заголовочный файл" (API header file) в интернете. Огромная коллекция их находится на сайте www.delphi-jedi.org. Если не помогло и это - придется взять описание функции из документации производителя данного API (обычно оно на С) и самому сделать ее обьявление, так же, как это сделано в windows.pas, только в своем юните. Сергей Кабиков ------------------------------------------------------------ Q-97: Автоматическое определения кодировки текста ------------------------------------------------------------ AG> Существуют ли в сободном для изучения доступе алгоритмы автоматического AG> определения кодировки текста? О, еще сколько. Методом таблицы модельных распределений: type TCodePage = (cpWin1251, cp866, cpKOI8R); PMap = ^TMap; TMap = array [#$80..#$FF] of Char; function GetMap(CP: TCodePage): PMap; { должна возвращать указатель на таблицу перекодировки из CP в Windows1251 (nil для CP = cpWin1251) } begin GetMap:=nil; end; function DetermineRussian(Buf: PChar; Count: Integer): TCodePage; const ModelBigrams: array [0..33, 0..33] of Byte = ( {АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ_Ё} {А}(0,20,44,12,22,23,16,60,4,9,63,93,47,110,0,16,35,61,81,1,5,13,24,17,12,4, 0,0,0,0,14,31,205,1), {Б}(19,0,0,0,4,19,0,0,8,0,2,15,1,4,41,0,15,5,0,15,0,2,1,0,0,6,16,37,0,0,0,4, 3,0), {В}(97,0,1,0,2,57,0,5,40,0,4,25,2,23,78,2,8,28,4,12,0,1,0,0,8,1,0,40,1,0,0,5 ,106,3), {Г}(13,0,0,0,9,5,0,0,15,0,1,17,1,2,96,0,24,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,8,0 ), {Д}(63,0,9,1,2,71,1,0,35,0,3,16,2,22,50,2,19,9,2,25,0,2,1,0,1,0,1,9,4,0,1,5, 17,4), {Е}(4,14,15,34,56,22,13,14,2,34,39,77,73,150,6,9,101,64,81,1,0,15,5,12,10,6, 0,0,0,0,3,4,235,1), {Ж}(13,0,0,0,12,47,0,0,16,0,1,0,0,23,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,2,2 ), {З}(76,2,11,3,11,4,1,0,7,0,2,4,11,24,17,0,6,1,0,8,0,0,0,0,0,0,0,16,6,0,1,4,1 7,0), {И}(7,9,32,5,18,60,4,42,31,27,28,46,55,49,12,7,26,60,53,0,5,25,14,28,4,1,0,0 ,0,0,9,56,255,0), {Й}(0,0,0,0,2,0,0,0,0,0,1,3,0,3,0,0,0,10,3,0,0,0,0,1,1,0,0,0,0,0,0,0,122,0), {К}(92,0,3,0,0,7,2,1,39,0,0,27,0,14,110,0,18,5,35,18,0,0,11,0,0,0,0,0,0,0,0, 0,5,5,0), {Л}(85,1,0,2,1,70,6,0,85,0,5,3,0,9,67,1,0,9,0,15,0,0,0,2,0,0,0,9,66,0,15,43, 57,4), {М}(44,0,0,0,0,65,0,0,47,0,1,1,10,15,57,7,0,2,0,24,0,0,0,0,0,0,0,28,0,0,0,8, 109,3), {}(139,0,0,1,11,108,0,4,152,0,7,0,1,69,161,0,0,8,25,24,5,1,5,2,0,1,0,83,10,0 ,1,29,38,5), {О}(0,72,139,76,74,32,32,19,12,52,21,93,68,72,7,34,93,102,98,1,2,6,6,19,15,2 ,0,0,0,1,4,9,252,2), {П}(17,0,0,0,0,43,0,0,14,0,1,9,0,1,125,3,120,1,2,8,0,0,0,0,0,0,0,3,6,0,0,3,2 ,2), {Р}(151,1,6,4,3,103,7,0,76,0,4,0,11,10,117,1,0,5,9,39,2,5,0,1,3,0,0,24,7,0,1 ,10,22,5), {С}(24,1,21,0,3,39,0,0,33,0,56,41,11,15,58,30,5,30,183,16,0,4,1,4,1,0,0,8,25 ,0,1,50,41,2), {Т}(83,0,43,0,3,87,0,0,71,0,9,3,2,26,180,0,55,33,1,23,1,0,1,4,0,0,0,20,78,0, 0,5,82,4), {У}(3,6,7,14,19,8,13,6,0,1,13,15,10,7,0,12,17,16,19,0,1,3,0,12,5,8,0,0,0,0,2 2,1,65,0), {Ф}(4,0,0,0,0,4,0,0,11,0,0,1,0,0,9,0,3,0,0,4,1,0,0,0,0,0,0,0,0,0,0,0,2,0), {Х}(9,0,2,0,0,2,0,0,5,0,0,1,0,5,26,0,4,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,76,0), {Ц}(5,0,0,0,0,16,0,0,48,0,1,0,0,0,4,0,0,0,0,3,0,0,0,0,0,0,0,2,0,0,0,0,3,0), {Ч}(30,0,0,0,0,52,0,0,23,0,3,1,0,14,1,0,0,0,36,5,0,0,0,0,1,0,0,0,1,0,0,0,2,2 ), {Ш}(13,0,0,0,0,28,0,0,17,0,4,4,0,4,3,0,0,0,1,3,0,0,0,0,0,0,0,0,3,0,0,0,1,1), {Щ}(6,0,0,0,0,23,0,0,16,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1), {Ъ}(0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0), {Ы}(0,5,14,1,3,28,0,2,0,22,6,19,21,2,0,5,4,7,10,0,0,37,0,3,4,0,0,0,0,0,0,1,8 4,0), {Ь}(0,1,0,0,0,9,0,10,1,0,13,0,2,26,0,0,0,10,3,0,0,0,1,0,6,0,0,0,0,0,6,4,117, 0), {Э}(0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,31,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0), {Ю}(0,5,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,1,15,0,0,0,1,4,1,15,0,0,0,0,0,0,38,0), {Я}(0,0,9,2,7,10,3,19,0,0,1,6,7,8,0,0,2,6,19,0,0,3,5,1,0,3,0,0,0,0,5,2,177,0 ), {_}(42,80,193,43,109,41,18,53,159,0,144,27,83,176,187,229,70,231,99,47,15,13 ,6,58,7,0,0,0,0,38,0,22,0,2), {Ё}(0,0,0,0,3,0,0,0,0,0,2,4,4,8,0,0,5,3,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)); { "рейтинг" буквы Ё условно принимается равным 1/20 от "рейтинга" буквы E, если сочетание с участием Ё корректно, иначе - 0 } type TVariation = array [0..33, 0..33] of Integer; var I, J, iC, iPredC, Max: Integer; C: Char; CP: TCodePage; D, MinD, Factor: Double; AMap: PMap; PV: ^TVariation; Vars: array [TCodePage] of TVariation; begin DetermineRussian:=cpWin1251; { по yмолчанию } { вычисление распределений биграмм } FillChar(Vars, SizeOf(Vars), 0); for CP:=Low(Vars) to High(Vars) do begin AMap:=GetMap(CP); PV:=@Vars[CP]; iPredC:=32; for I:=0 to Count - 1 do begin C:=Buf[I]; iC:=32; if C >= #128 then begin if AMap <> nil then C:=AMap^[C]; if not (C in ['Ё', 'ё']) then begin C:=Chr(Ord(C) and not 32); { 'a'..'я' -> 'А'..'Я' } if C in ['А'..'Я'] then iC:=Ord(C) - Ord('А'); end else iC:=33; end; Inc(PV^[iPredC, iC]); iPredC:=iC; end; end; { вычисление метрики и определение наиболее правдоподобной кодировки } MinD:=0; for CP:=Low(Vars) to High(Vars) do begin PV:=@Vars[CP]; PV^[32, 32]:=0; Max:=1; for I:=0 to 33 do for J:=0 to 33 do if PV^[I, J] > Max then Max:=PV^[I, J]; Factor:=255 / Max; { ноpмализация } D:=0; for I:=0 to 33 do for J:=0 to 33 do D:=D + Abs(PV^[I, J] * Factor - ModelBigrams[I, J]); if (MinD = 0) or (D < MinD) then begin MinD:=D; DetermineRussian:=CP; end; end; end; begin { тест: слово 'Пример' в разных кодировках (веpоятность ошибок на таких коpотких текстах высока - в данном слyчае пpосто повезло!) } writeln(DetermineRussian(#$CF#$F0#$E8#$EC#$E5#$F0, 6) = cpWin1251); writeln(DetermineRussian(#$8F#$E0#$A8#$AC#$A5#$E0, 6) = cp866); writeln(DetermineRussian(#$F0#$D2#$C9#$CD#$C5#$D2, 6) = cpKOI8R); readln; end. -- Best regards, Stas Malinovski. mailto:stasm@tsl.ru ------------------------------------------------------------ Q-98: Как помигать лампочками на клавиатуре? ------------------------------------------------------------ var KeyState : TKeyboardState; begin GetKeyboardState(KeyState); KeyState[VK_NUMLOCK] := KeyState[VK_NUMLOCK] xor 1; SetKeyboardState(KeyState); end; Изменяет состояние индикаторов на обратное... См. также VK_NUMLOCK, VK_CAPITAL WinNT: { keybd_event( VK_SCROLL, 0x46, KEYEVENTF_EXTENDEDKEY | 0, 0 ); keybd_event( VK_SCROLL, 0x46, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); } Stas Malinovski. mailto:stasm@tsl.ru ------------------------------------------------------------ Q-99: Как создать в runtime форму ------------------------------------------------------------ with TxxForm.Create(Self) do Show; with TxxForm.Create(Self) do try ShowModal; finally Free; end; ------------------------------------------------------------ Q-100: Как прочитать порт или записать в него. ------------------------------------------------------------ В мультизадачных ОС как правило доступ к портам запрещен идеологией системы. И это неспроста - подумайте, что будет, если одновременно с вашей программой этот же порт попробует использовать другая программа. Но в Win9x существует частичная возможность обратиться напрямую с помощью ассемблерных команд. Делать это надо с определенной осторожность. Даже если вы получите доступ до порта на своей машине, то это не означает, что это будет и на другой машине, например доступ до LPT порта может быть закрыт драйвером принтера, такое редко но встречается. Доступ к наиболее важным портам прикрыты запрещен полностью соответствующими системными драйверами. В Win NT доступ к оборудованию со стороны пользовательской программы запрещен полностью. Для доступа на этих ОС требуется использовать kernel mode драйвера, тоже самое рекомендуется и для Win9x. Вот несколько полезных ссылок: TVicHW32 http://www.entechtaiwan.com/tools.htm Tinyport (NT) http://www.winsite.com/info/pc/winnt/programr/tinypo21.zip.drag DriverX http://www.tetradyne.com giveio (NT) http://www.wideman-one.com/gw/tech/Delphi/iopm/index.htm Ports, by Harold Howe, http://www.bcbdev.com/components.htm Код доступа к портам с помощью ассемблера. procedure WritePortByte(Port:Word; Value:Byte); asm XCHG EDX,EAX OUT DX,AL end; procedure WritePortWord(Port:Word; Value:Word); asm XCHG EDX,EAX OUT DX,AX end; function ReadPortByte(Port:Word) : Byte; asm MOV EDX,EAX IN AL,DX end; function ReadPortWord(Port:Word) : Word; asm MOV EDX,EAX IN AX,DX end; Примечание: Существуют устройства с подряд идущими (по адресам) _байтовыми_ портами, к которым нельзя обращаться со словными командами I/O. На сегодня они почти вымерли, но : При выборе типа процедуры (BYTE или WORD) следует ориентироваться на спецификацию устройства ввода-вывода, к которому идет обращение. Не следует обращаться к байтовому устройству с WORD-ориентированными процедурами - экономия времени мизерная, а побочные эффекты могут быть катастрофическими." Например, некоторые адаптеры сбрасывают биты ошибок после чтения статус-регистра. Другие отображают несколько внутренних регистров на один адрес I/O, и т.п. На некоторых старых компьютерах Word процедуры могут не работать из за специфических особенностей интерфейса, правда такие компьютера практически уже не встречаются. Есть ISA Bus Specification, где эти вопросы четко формализованы. Выборка словного порта может быть разбита на два раза, даже если адрес четный, в зависимости от пожеланий устройства I/O. ------------------------------------------------------------ Q-101: Как работать с битами? ------------------------------------------------------------ Есть два способа. Низкоуровневый подход обеспечивается логическими операциями : var I : integer; N : integer; // Номер бита в диапазоне от 0..SizeOf(TYPE)*8 - 1 I := I or (1 shl N); // установка бита I := I and not (1 shl N); // сброс бита I := I xor (1 shl N); // инверсия бита if (i and (1 shl N)) <> 0 then... // проверка установленного бита Высокоуровневый подход опирается на представление числа в виде множества: type TIntegerSet = set of 0..SizeOf(Integer)*8 - 1; var I : Integer; N : Integer; Include(TIntegerSet(I), N); // установили N-ный бит в 1 Exclude(TIntegerSet(I), N); // сбросили N-ный бит в 0 if N in TIntegerSet(I) then... // проверили N-ный бит ------------------------------------------------------------ I-102: Список рекомендуемой литературы ------------------------------------------------------------ 1. А. Архангельский, В. Ильин, М. Тагин Русская справка (HELP) по Delphi 5 и Object Pascal (32 стр. с CD-ROM) Бином, ISBN 5-7989-0168-8 2. А. Архангельский. Программирование в Delphi 5 Бином, ISBN 5-7989-0104-1 3. А. Архангельский. Программирование в Delphi 6 Бином, ISBN 5-7989-0227-7 4. П.Даpахвелидзе, Е.Маpков Delphi 4 в подлиннике 5. П. Дарахвелидзе, Е. Марков, О. Котенок Программирование в Delphi 5 BHV-СПб, ISBN 5-8206-0052-5 6) П.В. Шумаков, В.В. Фаронов "Delphi xx. Руководство разработчика баз данных." 7) М.Кэнту Delphi 4 для пpофессионалов 8. Ч.Калвеpт Delphi 4, Энциклопедия пользователя 9. Стив Тейксейра, Ксавье Пачеко Delphi 5. Руководство разработчика. Том 1. Основные методы и технологии программирования Вильямс, ISBN 5-8459-0016-6 2000 Вильямс 10. Стив Тейксейра И Ксавье Пачеко Delphi 5. Руководство разработчика. Том 2. Разработка компонентов и работа с базами данных 2000 Вильямс 11. Конопка Рей Создание оригинальных компонент в среде Delphi: Пер. с англ./Рей Конопка. К.: НИПФ - "ДиаСофт Лтд.", 1996. - 512 с. ISBN 5-7707-9551-4 12. Лишнер Рэй Секреты Delphi 2: Пер. с англ./Рэй Лишнер. - К.: НИПФ - "ДиаСофт Лтд.", 1996. - 800 с. ISBN 966-7033-10-4 13. Том Сван "Секреты 32-разрядного программирования в Delphi" Диалектика, Киев, 1997. 480 стр., ISBN 966-506-052-X (рус.) 14. Дэн Оузьер "Дельфи 2. Освой самостоятельно." Восточная Книжная Компания, 1997. 624 стр. Binom. 15. Михаил Кpаснов. DirectX Гpафика в пpоектах Delphi BHV ISBN-5-94157-033-3 В списке отсутствует ряд хороших книг, по причине недостаточнысти данных, если у кого есть замечания, исправления или дополнения по данной статье, то просьба посылать их прямо на mailto: faq@nps.vnet.ee Новые книги можно искать и заказывать через Интернет на сайте http://books.ru Там же как правило есть аннотация. Кроме указанных книг существует большое количество ресурсов в Интернете посвященных Дельфи - это статьи, электронные библиотеки и прочее. Один из ресурсов расположен на моем сайте - это несколько проектов электронных библиотека, в совокупности свыше 200 книг. Доступ ко всем проектам прямо с главной страницы http://www.podgoretsky.com, существует так же доступ и по FTP (3 анонимных сессии) Один из недостатков, это то что сервер сильно перегружен все 24 часа в сутки, семь дней в неделю, поэтому скорость весьма низкая, поэтому желательно использовать какой либо менеджер закачек, также не рекомендуется использовать многопотоковую закачку, это не ускорит сам процесс закачки, а только уменьшит возможность закачки для других пользователей. Большинство книг с моего сервера, также доступны и на других серверах и если есть возможность взять их из другого источника, то это будет более оптимальным вариантом по скорости. ------------------------------------------------------------ Q-103: Как удалить непустой каталог? ------------------------------------------------------------ procedure TForm1.Button1Click(Sender: TObject); var lpFileOp: TSHFileOpStruct; begin FillChar(lpFileOp,SizeOf(lpFileOp),0); lpFileOp.Wnd := Handle; lpFileOp.wFunc := FO_DELETE; lpFileOp.pFrom := PChar(Edit1.Text); lpFileOp.fFlags := FOF_NOCONFIRMATION; SHFileOperation(lpFileOp); end; Ivan Daniloff <abc12345@eprst.ru> ------------------------------------------------------------ Q-104: Как получить список файлов со всеми подкаталогами ------------------------------------------------------------ procedure ScanDir(StartDir: string; Mask:string; List:TStrings); var SearchRec : TSearchRec; begin if Mask = '' then Mask := '*.*'; if StartDir[Length(StartDir)] <> '\' then StartDir := StartDir + '\'; if FindFirst(StartDir+Mask, faAnyFile, SearchRec) = 0 then begin repeat Application.ProcessMessages; if (SearchRec.Attr and faDirectory) <> faDirectory then List.Add(StartDir + SearchRec.Name) else if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin List.Add(StartDir + SearchRec.Name + '\'); ScanDir(StartDir + SearchRec.Name + '\',Mask,List); end; until FindNext(SearchRec) <> 0; FindClose(SearchRec); end; end; Пример вызова. параметры 1. имя папки 2. маска, по умолчанию *.* 3. хранилище для резульатат, любой наследник от TString, например TStringList procedure TForm1.Button1Click(Sender: TObject); begin ListBox1.Items.Clear; ScanDir('c:','',ListBox1.Items); Label1.Caption := IntToStr(ListBox1.Items.Count); end; Анатолий Подгорецкий anatoly@podgoretsky.com ------------------------------------------------------------ I-105: Информация о программе ------------------------------------------------------------ FAQ создан с помощью FAQ Maker ver. 1.1 от Анатолия Подгорецкого Доступен на http:/www.podgoretsky.com или http://nps.vnet.ee Альтернативный источник http://faq.delphiplus.org - более быстрый хостинг, FAQ центр, хранятся всевозможные FAQ, не только из иерархии FIDO7.RU.DELPHI.*
Секция 3 из 3 - Предыдущая - Следующая
Вернуться в раздел "Языки Pascal/Delphi" - Обсудить эту статью на Форуме |
Главная - Поиск по сайту - О проекте - Форум - Обратная связь |