faqs.org.ru

 Главная > Программирование > Языки 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" - Обсудить эту статью на Форуме
Главная - Поиск по сайту - О проекте - Форум - Обратная связь

© faqs.org.ru