Отправляет email-рассылки с помощью сервиса Sendsay

Программирование на Delphi

  Все выпуски  

Программирование на DELPHI v3-7 Нумер 26


Информационный Канал Subscribe.Ru

"На заметку хакеру:
Тело помещенное в воду,
сначала вытесняет такой-же объем воды,
а затем выдает все пароли..."


Выпуск № 26

Здравствуйте, уважаемые подписчики!


Сразу хочу выразить признательность всем кто откликнулся и написал мне. Поступило немало интересных предложений, и еще больше конкретных вопросов.
К сожалению элементарный подсчет показал, что ответить на все вопросы не получиться физически. А попытки задавать эти вопросы со страниц рассылки, грозят превратить оную в огромный опросник - чего не хотелось-бы.
Поэтому сразу и на будущее хочу попросить прощения у тех кому не ответил письмом и тех чьйи вопросы не появились на страницах рассылки. Возможно они появяться в следующих номерах.
Кроме-того хочу поблагодарить людей предложивших хостинг для несуществующего пока сайта. Здесь ситуация несколько пародоксальная, у меня есть место на професиональном хостинге, на котором все включено (php, MySQL и т.п.), проблемма в свободном времени на создание сайта. Возможно у кого-то есть готовый "движок" на php и человек готов для общего блага, помочь в его переделке под мои требования. Пишите мне обсудим. Т.к. действительно ТАКОЙ рассылке сложно без сайта. В первую очередь потому что я не могу здесь выкладывать какие-либо решения требующие несколько экранов кода на Delphi. И уж конечно обмениваться документацией.

Пришло немало писем с просьбой рассказать как работать с COM и LPT портами. А так-как работа с ними осуществляется очень легко - то как говориться не вижу причины почему-бы не рассказать.

Для начала маленькое вступление, зачем это может понадобиться. Впервые я с этим столкнулся, работая в одной фирме. Там на складе стоял матричный принтер (никакой другой не выдерживал такой пыли) и на нем печатались накладные для сборки товара. Но печатались они штатными средствами Windows, т.е. в виде графики. При этом на 1 страницу уходит около 4-5 мин., и каждая строчка печатается в несколько проходов, в итог быстрый износ принтера, картриджа и 5 мин. на страницу, а это не всякая психика выдержит - больно громко :). Потом я написал надстройку для печати сразу в порт LPT - в итого строчка печатается в 1 проход, и время на страницу 15-20 секунд. т.е. износ принтера уменьшается в 20-30 раз. Хочу сразу предупредить что принтер получает только коды символов, а печатает своими встроеными шрифтами. А они индивидуальны для каждой модели принтера. Поэтому с этим Вам прийдется поиграться самостоятельно, изучив инструкцию к принтеру.

А перед тем как открыть Вам страшную тайну, печати сразу в порт. Рекомендую проделать один эксперимент. Откройте что-то позволяющее работать с командной строкой, например "Far manager", либо выйдите в ДОС (если он у Вас есть), или в Windows2000 (думаю и в ХР тоже), можете нажать "ПУСК", "Выполнить" и наберите cmd.exe, при этом откроется окно напоминающее DOS (черный экран).
И так в командную строку попали, а теперь наберите команду Dir и нажмите Enter перед Вами пронесется каталог текущего диска. Усложним эксперимент наберите "dir > d.txt" покажется что ничего не произошло, но на самом деле создасться файл d.txt, в котором будет тот-же каталог. Интересно ?? А теперь самое интересное, если у Вас к порту LPT подключен (или COM1) подключен принтер, включите его и наберите команду "dir > LPT" или "dir > COM1" и о чудо! Каталог распечатается на принтер.
Я так долго это все рассказываю, т.к. порой это единственный способ узнать в чем проблемма с принтером. Т.к. если таким образом печать не происходит, то можете не мучать драйвера, они для этого НЕ нужны!!! И можете не ругать программу, которая не печатает. Это значит что проблемма в самом принтере, кабеле или у Вас не работает сам порт.
А из всего выше описанного можно сделать ошеломляющий вывод, для системы порты LPT и COM это практически те-же файлы, только имя у них изменить нельзя.
А значит достаточно на Delphi написать программу пишушую и/или читающую в/из файлов с именами "LPT" и "COM1"/"COM2".
А выглядеть это будет примерно так:

var
Printer: THandle;
N : Cardinal;
C : POverlapped;

begin
//Открываем порт принтера для записи
Printer := CreateFile(PChar('LPT1'),
GENERIC_READ or GENERIC_WRITE, 0, nil,
OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);

//Печатаем слово 'Hello World';
WriteFile(Printer, 'Hello World', 11, N, c);
//Закрываем порт
CloseHandle(Printer);


Для полноты расрытия темы, не удержусь и приведу еще один пример взятый с http://www.sources.ru.
В этом примере показыватеся как читать данные с модема подключенного к COM1.

Var
PortSpec : array[0..255] of char;
PortNo : Word;
success : Boolean;
error:integer;

begin
FillChar(PortSpec,Sizeof(PortSpec),#0);
StrPCopy(PortSpec,'Com1:19200,n,8,1');
PortSpec[3]:=Char(Ord(PortSpec[3])+Ord(PortNo));

if not BuildCommDCB(PortSpec,Mode) Then
Begin
//какая-то ошибка...
Exit;
End;

PortSpec[5]:=#0; { 'Com1:' }

Mode.Flags:=EV_RXCHAR + EV_EVENT2; { $1001 }

Com := CreateFile(PortSpec,GENERIC_READ or GENERIC_WRITE,
0, //* comm устройство открывается с эксклюзивным доступом*/
Nil, //* нет security битов */
OPEN_EXISTING, //* comm устройства должны использовать OPEN_EXISTING*/
0, //* not overlapped I/O */
0 //* hTemplate должен быть NULL для comm устройств */
);
if Com = INVALID_HANDLE_VALUE then Error := GetLastError;
Success := GetCommState(Com,Mode);

if not Success then // Обработчик ошибки.
begin

end;

Mode.BaudRate := 19200;
Mode.ByteSize := 8;
Mode.Parity := NOPARITY;
Mode.StopBits := ONESTOPBIT;//нужен был для перезаписи в NT

Success := SetCommState(Com, Mode);

if not Success then // Обработчик ошибки.
begin

end;
end;


Переменная "com" типа dword.

Вы так же можете очистить буффер COM порта
PurgeComm(Com,PURGE_RXCLEAR or PURGE_TXCLEAR);
И прочитать из него

Function ReadCh(Var Ch:Byte):dword;
var
n : dword;
Begin
Readfile(Com,ch,1,result,nil);
End;


Теперь хочу привести несколько вопросов присланных читателями. Возможно кто-то знает ответы.
Подсажите, пожалуйста: как программно изменить кодировку таблицы базы данных. Т. е. то, что мы делаем при реструктуризации таблицы в Database Desktop выбирая в Table Properties - Table Language и там устанавливая необходимую.
Ответить: Елена

Следующий вопрос интересен и мне, поэтому присоеденюсь к вопросу читателя.
Как на делфи можно написать прогу, которая б включала/выключала сетевую карту незаметно, да желательно так, чтоб значек сети в трее убирала? Вероятно это делается функциями API, возможно-кто подскажет какими и их использование.
Ответить: Сюда

Возникла такая проблемка. Необходимо осуществлять отбор по ключевым словам в мемо полях для Intrebase и Paradox таблиц. Не подскажете как такое можно осуществить.
Ответить: serg

Оставайтесь с нами.
/Tisa


Написать письмо.

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.programondelphi
Отписаться

В избранное