Здравствуйте. Есть критически важный код, который не должен быть прерван никакими внутренними событиями(таймеры, прерывания от сом порта и т.д.), но после него, все поступившие сообщения должны быть обработаны, не потеряны. При этом этот код содержит обращения к Tablе. Спасибо.
Приветствую Вас, Вадим! Ну так и не допусти это. Эспользуй потоки(не моню если чесно тип). Ответ отправлен: 26.02.2004, 22:47 Отправитель: CJ Отвечает Boriss
Приветствую Вас, Вадим! Оформите его в виде потока TThread (есть стандартные примеры) - и придайте ему высокий приоритет Ответ отправлен: 26.02.2004, 18:29 Отправитель: Boriss Отвечает Pawel
Добрый день, Вадим! Вообшето запретить прерывания можно только на уровне драйвера или ядра. Но в данном случае можно обойтись повышением приоретета, или создания потока в привелегированним процессе. Ответ отправлен: 27.02.2004, 11:47 Отправитель: Pawel
Вопрос № 1362
Маленький пустячный вопросик,меня недавно спросили, можно ли запретить реакцию на клавиатуру, оветиь не составило труда, но тут у меня возник очень странный ворос! Как и каким образом Delpdi "читает" одновременное нажатие нескольких клавиш?
Добрый день, 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}. Т.е. характерное черное окно отсутствует. Дайте конкретный кусок кода. Плииииз.
Добрый день, 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. Знает ли кто-нибудь, что-нибудь по этому вопросу. Буду благодарен за любую информацию, рассуждения или ссылки. Пожалуйста. С уважением, АлекСандр.
Приветствую Вас, АлекСандр! Вы имеете в виду работу с фаилами 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, а также в процедуру выхода из программы. Теперь все ОК за мелким исключением - если пользователь выходит из программы не по моей кнопке или пункту меню, а по крестику в правом верхнем углу - файл остается неуничтоженным. В данной программе это несущественно - секретности особой нет - но вдруг в будущем окажется нужным? Да и эстетическое чувство страдает - нафиг нужен лишний файл. Если кто знает, как его изничтожить в любом случае - ответьте плиз.
Добрый день, 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.