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

RusFAQ.ru: Программирование на Delphi


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


RusFAQ.ru: Программирование на C++ Builder / Delphi

Выпуск № 297
от 02.03.2004, 02:10

Администратор:
Имя: Калашников О.А.
URL: Информационный ресурс
ICQ: 68951340
Россия, Москва
О рассылке:
Задано вопросов: 1375
Отправлено ответов: 3032
Активность: 220.5 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

CJ
Статус: Опытный
Общий рейтинг: 123.35
URL: Мой персональный сайт! Зайдите и не пожалеете!
[Подробней >>]
Boriss
Статус: Профессиональный
Общий рейтинг: 152.07
URL: Программирование на Паскале
[Подробней >>]
Pawel
Статус: Опытный
Общий рейтинг: 163.63
[Подробней >>]
 
Snowm@n
Статус: Доверительный
Общий рейтинг: 126.66
[Подробней >>]
samum2000
Статус: Опытный
Общий рейтинг: 126.75
[Подробней >>]
THE_PRO
Статус: Профессиональный
Общий рейтинг: 138.34
URL: THE_PRO
Телефон: (994 +12) 989647
[Подробней >>]
 
sir henry
Статус: Профессиональный
Общий рейтинг: 160.07
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 1361. Здравствуйте. Есть критически важный код, который не должен быть прерван никакими внутренними событи... (ответов: 3)
Вопрос № 1362. Маленький пустячный вопросик,меня недавно спросили, можно ли запретить реакцию на клавиатуру, оветиь... (ответов: 5)
Вопрос № 1363. Как проследить нажатие клавиш (например Shift+G) если приложение создается как консоль без параметра... (ответов: 2)
Вопрос № 1364. Подскажите, пожалуйста! Работал ли кто-нибудь через Delphi с AutoCad. Знает ли кто-нибудь, что-нибуд... (ответов: 1)
Вопрос № 1365. Задавал недавно вопрос о печати с помощью Excel. Эксперт Pavel вопрос похоже не понял или не прочел,... (ответов: 3)

Вопросов: 5, ответов: 14


 Вопрос № 1361

Здравствуйте.
Есть критически важный код, который не должен быть прерван никакими внутренними событиями(таймеры, прерывания от сом порта и т.д.), но после него, все поступившие сообщения должны быть обработаны, не потеряны. При этом этот код содержит обращения к Tablе.
Спасибо.



Вопрос отправлен: 26.02.2004, 17:35
Отправитель: Вадим

[Следующий вопрос >>] [Список вопросов]

Отвечает CJ

Приветствую Вас, Вадим!
Ну так и не допусти это. Эспользуй потоки(не моню если чесно тип).

Ответ отправлен: 26.02.2004, 22:47
Отправитель: CJ


Отвечает Boriss

Приветствую Вас, Вадим!
Оформите его в виде потока TThread (есть стандартные примеры) - и придайте ему высокий приоритет

Ответ отправлен: 26.02.2004, 18:29
Отправитель: Boriss


Отвечает Pawel

Добрый день, Вадим!
Вообшето запретить прерывания можно только на уровне драйвера или ядра.
Но в данном случае можно обойтись повышением приоретета, или
создания потока в привелегированним процессе.

Ответ отправлен: 27.02.2004, 11:47
Отправитель: Pawel


 Вопрос № 1362

Маленький пустячный вопросик,меня недавно спросили, можно ли запретить реакцию на клавиатуру, оветиь не составило труда, но тут у меня возник очень странный ворос! Как и каким образом Delpdi "читает" одновременное нажатие нескольких клавиш?



Вопрос отправлен: 26.02.2004, 22:44
Отправитель: war

[Следующий вопрос >>] [Список вопросов]

Отвечает Boriss

Добрый день, war!
Что Вы пониамете под одновременным нажатием клавиш, кои читает Delphi? Программа, которую пишут на Delphi одновременно "читает" (!обрабатывает!) нажатие только одной клавиши. Еще можно узнать состояние спец. клавиш по той причине, что они самой системной хранятся "в ином месте". То есть это Вы должны обрабатывать OoKeyDown и OnKeyUp, чтобы отследить сколько нажато одноврмененно. Но к Вам они поступили последовательно во времени. У клавиатуры есть сигналы - "клавиша нажата" и "клавиша отпущена"

Ответ отправлен: 28.02.2004, 13:58
Отправитель: Boriss


Отвечает Snowm@n

Приветствую Вас, war!
Коды одновременно нажатых клавиш складываются.
Например для Alt+F12 код будет VK_MENU+VK_F12.


Ответ отправлен: 29.02.2004, 18:31
Отправитель: Snowm@n


Отвечает CJ

Доброе время суток, war!
RegisterHotKey-прекрасный способ! Пиши на karatetski@tut.by если не понятно!

Ответ отправлен: 27.02.2004, 08:47
Отправитель: CJ


Отвечает Pawel

Здравствуйте, war!
Запретить реакцию на клавиотуру можно только на уровне драйвера.
Дельфи читает клавиши из буфера драйвера клавиатуры в том порядке в котором они были нажаты.

Ответ отправлен: 27.02.2004, 11:51
Отправитель: Pawel


Отвечает samum2000

Здравствуйте, war!
Сам по себе Delphi ничего не читает, он лишь обрабатывает значения, полученные от драйвера клавиатуры. А уж сколько клавишь было нажато должно беспокоить только клавиатуру :).

Ответ отправлен: 28.02.2004, 09:14
Отправитель: samum2000


 Вопрос № 1363

Как проследить нажатие клавиш (например Shift+G) если приложение создается как консоль без параметра {$APPTYPE CONSOLE}. Т.е. характерное черное окно отсутствует.
Дайте конкретный кусок кода.
Плииииз.



Вопрос отправлен: 27.02.2004, 06:46
Отправитель: HaM

[Следующий вопрос >>] [Список вопросов]

Отвечает THE_PRO

Добрый день, HaM!
if in shiftstate...

Ответ отправлен: 27.02.2004, 17:15
Отправитель: THE_PRO


Отвечает samum2000

Приветствую Вас, HaM!
Необходимо установить глобальный хук на клавиатуру.Я приведу некоторые функции, которые понадобятся, но вам все равно придется ознакомиться со статями на эту тему.
SetWindowsHookEx(idHook:Integer; lpfn:TFNHookProc;hMod: Hinst;dwThreadID:Cardinal);
idHook : в нашем случае это WH_KEYBOARD;
lpfn : Адрес в памяти функции ловушки (той, что будет обрабатывать нажатие клавиш);
hMod : Дескриптор dll в которой находится функция (т.е. Dll ДОЛЖНА быть загружена к моменту вызова)
dwThreadID : 'id потока', который Ваша программа будет контролировать. Если это глобальная ловушка (как наша), то параметр должен быть 0.
Функция hook (code: integer;Wparam: word;LParam: dword) это процедура, которая вызывает в случае, если необходимое нам событие происходит. Например, если установлена ловушка типа WH_KEYBOARD, то окно будет передавать в ловушку информацию о том, какая клавища была нажата. Для Вашей процедуры hook необходимы следующие аргументы:
Code Указывает на то, что означают следующие два параметра
wParam Параметр размером в 1 слово (word)
lParam longword Параметр размером в 2 слова
CallNextHookEx вызывает следующую ловушку. Когда Ваша процедура ловушки завершится, то она должна вызовать CallNextHookEx, а затем вернуть заданное значение, в зависимости от типа ловушки.
UnhookWindowsHookEx удаляет Вашу ловушку. Единственный аргумент этой функции - это дескриптор ловушки, возвращаемы функцией SetWindowsHookEx.
Подробнее можно узнать в Windows SDK.

Ответ отправлен: 01.03.2004, 12:04
Отправитель: samum2000


 Вопрос № 1364

Подскажите, пожалуйста!
Работал ли кто-нибудь через Delphi с AutoCad.
Знает ли кто-нибудь, что-нибудь по этому вопросу.
Буду благодарен за любую информацию, рассуждения или ссылки.
Пожалуйста.
С уважением, АлекСандр.



Вопрос отправлен: 27.02.2004, 10:27
Отправитель: АлекСандр

[Следующий вопрос >>] [Список вопросов]

Отвечает Pawel

Приветствую Вас, АлекСандр!
Вы имеете в виду работу с фаилами AutoCad или работу на напрямую с AutoCad.
По поводу фаилов, я натыкался(давно было) на документацию.
Многое зависит от версии AutoCad.

Ответ отправлен: 27.02.2004, 11:54
Отправитель: Pawel


 Вопрос № 1365

Задавал недавно вопрос о печати с помощью Excel. Эксперт Pavel вопрос похоже не понял или не прочел, sir henry посоветовал разумные вещи, но, к сожалению, в данном случае неприменимые. Суть как раз в том, что пользователь открывает таблицу со своими данными, может добавить какое-то свое форматирование, изменить ширину столбцов, затем напечатать. Все, Excel больше не нужен, данные имеются в базе, отчет уже на бумаге, при необходимости он сам сохранит таблицу при помощи "Сохранить как...". Если сохранять шаблон сразу после открытия, после корректировок, внесенных пользователем, при закрытии программа все равно будет вопрошать "Сохранить ли изменения?", а именно этого я и хочу избежать - чтобы пользователь даже случайно не смог испортить шаблон, ну и в случае, если шаблон сохранен как при открытии - чтобы не доставать его лишними вопросами. Ответ эксперта Boriss не понял я сам - возможно там все верно - но этот кусок кода я никуда вставить не смог - Delphi меня не поняла.
В итоге я все же сделал, что хотел, привожу (может, кому понадобится):
//отсоединение от сервера автоматизации
procedure TfmMain.ExBBeforeClose(Sender: TObject; var Cancel: OleVariant);
begin
ExB.SaveAs('C:fff.xls',EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,1,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,1);
ExS.Disconnect;
ExB.Disconnect;
Ex.Disconnect;
end;
(здесь ExB - это ExcelWorkBook, ну и соответственно там рабочий лист и аппликейшен)
Сделано методом тыка. Есть во входных параметрах Cancel - может быть его надо было каким-то образом передать, и сохранения не было бы - кто знает - напишите.
Теперь возникла задача уничтожить этот сохраненный файл, иначе при каждом следующем закрытии будет предлагаться его переписать. В какое бы событие я ни пытался втиснуть
DeleteFile('C:fff.xsl');(например, в приведенный выше пример последней строкой)
нигде почему-то не работает. В итоге я сунул это в самое начало процедуры вызова таблицы Excel, а также в процедуру выхода из программы. Теперь все ОК за мелким исключением - если пользователь выходит из программы не по моей кнопке или пункту меню, а по крестику в правом верхнем углу - файл остается неуничтоженным. В данной программе это несущественно - секретности особой нет - но вдруг в будущем окажется нужным? Да и эстетическое чувство страдает - нафиг нужен лишний файл. Если кто знает, как его изничтожить в любом случае - ответьте плиз.



Вопрос отправлен: 27.02.2004, 15:01
Отправитель: Loko

[Следующий вопрос >>] [Список вопросов]

Отвечает Snowm@n

Добрый день, Loko!
На мой взгляд два пути:
1) Отловить событие закрытия формы и запретить его
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=False;
end;
2) Сделать неактивной кнопку закрытия формы
использованием функции
DeleteMenu(hMenuHandle,SC_CLOSE,MF_BYCOMMAND);


Ответ отправлен: 29.02.2004, 18:56
Отправитель: Snowm@n


Отвечает Pawel

Здравствуйте, Loko!
Нужно удалять фаил по onClose.
DeleteFile('C:fff.xsl')????
DeleteFile('C:fff.xsl') так будет вернее.

Ответ отправлен: 27.02.2004, 19:53
Отправитель: Pawel


Отвечает sir henry

Приветствую Вас, Loko!
1. В принципе решение верное, только засунуть его надо в событие закрытия главной формы OnClose:
TForm1.FormClose
Тогда у Вас эти функции будут отрабатываться как бы пользователь не закрывал прогу - кнопкой или крестиком.
2. Еще раз настоятельно советую, чтобы не повредить шаблон, SaveAs делать сразу после его открытия.
3. Из-за чего Вы решили, что DeleteFile не работает? Выдается ошибка? Функция молча отработает, но файл остается на месте? Может быть Вы пытаетесь удалить все еще открытый файл? Имя файла и путь у Вас в обоих случаях одно и тоже? А то, судя по тому, что Вы написали, сохраняете Вы под одним именем, а удаляете совершенно другой файл :)).

Ответ отправлен: 27.02.2004, 15:55
Отправитель: sir henry



Форма отправки вопроса

Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

(C) 2002-2003 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (26)
C / C++ (19)
Perl (2)
Builder / Delphi (19)
Pascal (21)
Basic / VBA (8)
Java / JavaScript (3)
PHP (12)
Криптография (7)
WinAPI (14)
Радиоэлектроника (8)
Пользователю
Windows 95/98/Me (38)
Windows NT/2000/XP (57)
"Железо" (32)
Поиск информации (14)
Администратору
Windows NT/2000/XP (30)
Linux / Unix (11)
Юристу
Гражданское право (16)
Семейное право (12)
Трудовое право (12)
КоАП (10)

Отправить вопрос всем экспертам выбранной рассылки.




Задать вопрос | Регистрация эксперта | Поиск в базе | Чат | Форумы | Новости
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.


Яндекс цитирования
© 2001-2004 Россия, Москва. Авторское право: Калашников О.А.

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное