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

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


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

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 235
от 11.09.2005, 21:24

Администратор:Калашников О.А.
В рассылке:Подписчиков: 237, Экспертов: 51
В номере:Вопросов: 5, Ответов: 20


Вопрос № 25900: Здравствуйте эксперты, у меня такой вопрос: где можно найти компонент, с помощью которого можно напрямую работать с COM-портом в Delphi из под Win-XP. Под 98й все прекрасно, а вот XP/2k не дают прямого доступа к портам ввода-вывода :(...
Вопрос № 25908: 1) Как найти запись по нескольким полям в TQuery, но чтобы было частичное совпадение? Например, поиск записи по названию и адресу. Причем ввод например по первым буквам: название="А" и Адрес="Б", - показать первую фирму с назв...
Вопрос № 25941: Здравствуйте Ув. эксперты. Подскажите, возможно ли и если да - то как сделать следующие: 1. Перехватить сообщение о нажатие кнопки, которая находится в другом приложении 2. Удалить это сообщение из очереди 3. Поставить это сообщение в...
Вопрос № 25952: Здравствуйте. Помогите решить проблему, требуется в gif картинке черный цвет сменить на красный. На bmp картинках все проходить нормально, я просто в цикле перебираю все пикселы и если натыкаюсь на черный то меняю этот цвет. Имеит ли знач...
Вопрос № 25954: В модуле Classes (Delphi 6) объявлена переменная FindGlobalComponentProcs: TList. В приложении приведены процедуры и функции этого модуля, которые её используют. В finalization этого модуля последней строчкой записано FreeAndNil(FindGlobalComponentPr...

Вопрос № 25.900
Здравствуйте эксперты, у меня такой вопрос: где можно найти компонент, с помощью которого можно напрямую работать с COM-портом в Delphi из под Win-XP. Под 98й все прекрасно, а вот XP/2k не дают прямого доступа к портам ввода-вывода :(
Отправлен: 06.09.2005, 03:36
Вопрос задал: L0ki (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: sir henry
Здравствуйте, L0ki!
Вообще-то есть специальная функция, которая учитывает все эти нюансы - CreateFile(). Никогда не подводит, что в 9х, что в w2k. :)
Компонент Вы можете скачать на www.torry.net.
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 06.09.2005, 05:49

Отвечает: Силантьев Евгений Александрович
Здравствуйте, L0ki!
Посмотрите на www.torry.net. Это огромная "клодовая" компонентов для Delphi и Builder'а.
---------
The world is mine! :)
Ответ отправил: Силантьев Евгений Александрович (статус: 5-ый класс)
Отправлен: 06.09.2005, 06:57

Отвечает: Jadd
Здравствуйте, L0ki!
Да и под вынь98 тоже не дают. А компонент можно найти на www.torry.net или в MSDN найти описание функций для работы с COM-портом (CreateFile и прочие)
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Практикант)
Отправлен: 06.09.2005, 09:33

Отвечает: Malish
Здравствуйте, L0ki!
Не встрачел такого компонента. Используй CreateFile.
Ответ отправил: Malish (статус: Студент)
Отправлен: 06.09.2005, 18:50


Вопрос № 25.908
1) Как найти запись по нескольким полям в TQuery, но чтобы было частичное совпадение?
Например, поиск записи по названию и адресу. Причем ввод например по первым буквам: название="А" и Адрес="Б", - показать первую фирму с названием на А и с адресом на Б.
Делал Locate, но не идет поиск с частичным совпадением по нескольким полям. Для одного поля все ищется.
Как быть?
(менять SQL и заново выдавать запрос нежелательно)

2) В DB2 сортировка русских букв идет не очень корректно (толи сама DB2 глючная, толи BDE или еще чего). Нет ли компоненты, который бы цеплялся к Table и делал сортировку уже сам?
Отправлен: 06.09.2005, 10:16
Вопрос задал: GuV (статус: Посетитель)
Всего ответов: 6
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Jadd
Здравствуйте, GuV!
1)SQL - самый действенный способ. Есть еще SetRange и Filter. Я бы выбрал первый, т.к. так или иначе на системнойм уровне будут запросы к базе.
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Практикант)
Отправлен: 06.09.2005, 10:25
Оценка за ответ: 4

Отвечает: Zubex
Здравствуйте, GuV!

Используй фильтр:
Table1.Filtered:=True;
Table1.Filter:='Name='#$27'А*'#$27' and Adress='#$27'Б*'#$27;

Но лучше всего все равно SQL:

select * from Firma
where Name like 'A%'
and Address like 'Б%'
Ответ отправил: Zubex (статус: 3-ий класс)
Отправлен: 06.09.2005, 10:57
Оценка за ответ: 4
Комментарий оценки:
Про фильтр тоже думал, но это все же не то, что поиск. Видимо придется грузить таблицу в память :)

Отвечает: Anefedov
Здравствуйте, GuV!
Используйте select с параметром сравнения like

select * from [yorTable] where [field1] like 'yourExpression1' and [field2] like 'yourExpression2'

Подробнее про SQL
http://books.kulichki.net/data/sql/sql1/

Приложение:

Ответ отправил: Anefedov (статус: 3-ий класс)
Отправлен: 06.09.2005, 11:09
Оценка за ответ: 1
Комментарий оценки:
Я писал, что SQL менять нежелательно.

Отвечает: sir henry
Здравствуйте, GuV!
1) А хелп слабо было почитать? Там все понятно написано:
Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean;
KeyFields - это поле или несколько полей, где идет поиск. Если несколько, то перечисляются через точку с запятой.
KeyValues - то, что ищется. Тоже, если несколько, то через точку с запятой. Фишка здесь в том, что первое значение ищется в первом поле (KeyFields[1]), второе - во втором и т.д.
Options - здесь указываются опции поиска:
- loCaseInsensitive - нечувствительность к регистру;
- loPartialKey - как раз то, что Вам нужно. Частичное совпадение.
Таким образом:
Query.Locate('Название;Адрес', VarArrayOf(['А', 'Б']), [loPartialKey]);
Хотя более правильно (раз Вы работаете с Query) изменить условие запроса или если у Вас условия одни и теже, за исключением вот этих вот "А" и "Б", сделать параметрический запрос.
2) Совершенно непонятно, зачем в SQL базе использовать Table. :)
Сделайте запрос с ключевым словом ORDER BY.
А чтобы сортировка не глючила, в базе нужен чарсет win1251.
У самой TTable нет никакой сортировки по одной простой причине - сортировкой заведуют индексы. Какой Вы индекс поставите текущим, такой у Вас сортировка и будет:
Table1.IndexName:='Индекс_по_нужному_полю';
Естественно индекс в базе уже должен присутствовать. :)
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 06.09.2005, 11:29
Оценка за ответ: 3
Комментарий оценки:
1) Вы сами-то тестите то, что пишете? По-моему, нет. Query.Locate('Название;Адрес', VarArrayOf(['А', 'Б']), [loPartialKey]); - не работает, т.к. поиск идет сначала первого слова целиком, а потом частично второго. Попробуйте сами и убедитесь. А также я писал, что менять запрос вообще нежелательно по причине слишком большого числа получаемых записей. На OnChange его не повесишь.
2) Многие заблуждаются, думая, что Table нужно использовать только в локальных БД. Его очень часто используют и при сетевых БД, когда надо просто выдать таблицу пользователю безо всяких изысков Sql.

Отвечает: Romodos
Здравствуйте, GuV!
А вы ищете так??
query1.locate(
'поле1;поле2;...;полеN',
VarArrayOf(['значение1','значение2',...,'значениеN',]),
[loPartialKey]);
Может это код поможет вам. Конкретизируйте, как вы ищете
---------
FAQ me off!
Ответ отправил: Romodos (статус: 5-ый класс)
Отправлен: 06.09.2005, 17:54
Оценка за ответ: 3
Комментарий оценки:
Query1.Locate('Field1;Field2', VarArrayOf([Text1, Text2]), [loCaseInsensitive,loPartialKey]);
Вот так. Поиск идет сначала целиком по первому полю, потом частично по второму. А хотелось бы частично и по первому и по второму

Отвечает: Ballon
Здравствуйте, GuV!

Попробуйте написать такой запрос должно работать.

SELECT * FROM таблица WHERE название LIKE 'А%' AND адрес LIKE 'Б%'

У меня работает.
Ответ отправил: Ballon (статус: 4-ый класс)
Отправлен: 07.09.2005, 10:38


Вопрос № 25.941
Здравствуйте Ув. эксперты.
Подскажите, возможно ли и если да - то как сделать следующие:
1. Перехватить сообщение о нажатие кнопки, которая находится в другом приложении
2. Удалить это сообщение из очереди
3. Поставить это сообщение в очередь
Это надо для того, чтобы после нажатия кнопки в постороннем приложении сначала выполнялись необходимые мне функции, а только затем функции, прикрепленные к кнопке. Если есть другие предложения как это сделать буду признателен!
Заранее благодарен всем кто ответит.
Отправлен: 06.09.2005, 17:55
Вопрос задал: Силантьев Евгений Александрович (статус: 5-ый класс)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Bob Johnson
Здравствуйте, Силантьев Евгений Александрович!
Возможны такие решения:
- использование хуков (SetWindowsHookEx). Перед тем как обработать сообщение, оно будет передано твоей процедуре, которая его проанализирует и, если надо, отменит обработку.
- ты внедряешься в чужой процесс и заменяешь функцию DispatchMessage своей, которая выполняет все перечисленные тобой действия. Обычно обработка сообщения начинается именно этой функцией.
Ответ отправил: Bob Johnson (статус: Академик)
Отправлен: 06.09.2005, 18:09
Оценка за ответ: 5
Комментарий оценки:
Спасибо огромное! Попробую разобраться с хуками!

Отвечает: Romodos
Здравствуйте, Силантьев Евгений Александрович!
По моему реализовать это на Delphi и вообще реализовать это невозможно
---------
FAQ me off!
Ответ отправил: Romodos (статус: 5-ый класс)
Отправлен: 06.09.2005, 18:37
Оценка за ответ: 2
Комментарий оценки:
Все возможно! Главное знать как!!!

Отвечает: Werewolf
Здравствуйте, Силантьев Евгений Александрович!
1)Если у Вас есть знания ассемблера читайте дальше если нет переходите к второму пункту /*Прием сложный для начинающих*/.
C помощью отладчика можно выяснить адрес обработчика нажатия на клавишу
или обработчика сообщения (если программа написана на си подобных языках). Далее идет внедрение своего кода. Тут уже дело творческое:
можно на ассемблере вогнать в адрес обработчика переход на свою часть программы, которую можно внедрить в безопасный участок кода программы; ваш код программы дожен заканчиваться переходом на первоначальный обработчик (если надо; его так жа лучше переместить в другой участок программы) или на место вызова обработчика для дальнейшего прохождения программы.
2) Вот другой вариант с хуками взят из статьи:
Как перехватывать события, посланные другим приложениям

Автор: Даниил Карапетян
WEB сайт: http://program.dax.ru

Для отслеживания каких-то событий во всей Windows нужно установить ловушку (hook). Например, такая ловушка может отслеживать все события, связанные с мышью, где бы ни находился курсор. Можно отслеживать и события клавиатуры.

Для ловушки нужна функция, которая, после установки ловушки при помощи SetWindowsHookEx, будет вызываться при каждом нужном событии. Эта функция получает всю информацию о событии. UnhookWindowsHookEx уничтожает ловушку.

Эта программа отслеживает все сообщения, связанные с мышью и клавиатурой. CheckBox1 показывает состояние левой клавиши мыши, CheckBox2 показывает состояние правой клавиши мыши, а CheckBox3 показывает, нажата ли какая-либо клавиша на клавиатуре.

var
HookHandle: hHook;

function HookProc(Code: integer; WParam: word; LParam: Longint): Longint; stdcall;
var
msg: PEVENTMSG;
begin
if Code >= 0 then begin
result := 0;
msg := Pointer(LParam);
with Form1 do
case msg.message of
WM_MOUSEMOVE: Caption := IntToStr(msg.ParamL) + #32 + IntToStr(msg.ParamH);
WM_LBUTTONDOWN: CheckBox1.Checked := true;
WM_LBUTTONUP: CheckBox1.Checked := false;
WM_RBUTTONDOWN: CheckBox2.Checked := true;
WM_RBUTTONUP: CheckBox2.Checked := false;
WM_KEYUP: CheckBox3.Checked := false;
WM_KEYDOWN: CheckBox3.Checked := true;
end;
end else
result := CallNextHookEx(HookHandle, code, WParam, LParam);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.FormStyle := fsStayOnTop;
CheckBox1.Enabled := false;
CheckBox1.Caption := 'left button';
CheckBox2.Enabled := false;
CheckBox2.Caption := 'right button';
CheckBox3.Enabled := false;
CheckBox3.Caption := 'keyboard';
HookHandle := SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, HInstance, 0);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
if HookHandle <> 0 then
UnhookWindowsHookEx(HookHandle);
end;
--------------------------
Пример не проверял - с первого взгляда все правильно
Ответ отправил: Werewolf (статус: 7-ой класс)
Отправлен: 07.09.2005, 00:41
Оценка за ответ: 5
Комментарий оценки:
Пример рабочий! У меня эта статья есть. Просто как-то не подумал, что это через хуки можно организовать! А за идею про ассемблер отдельное спасибо – учту. Может даже реализовать попробую!

Отвечает: Jadd
Здравствуйте, Силантьев Евгений Александрович!
Добавлю к уже сказанному экспертами (ну, правда, что повторяться насчет хуков?). Раз приложение запущено, значит можно получить хэндл его главного окна через FindWindow. А раз так, значит можно послать этому окну сообщение о нажатии кнопки, используя этот хэндл.
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Практикант)
Отправлен: 07.09.2005, 16:40


Вопрос № 25.952
Здравствуйте.
Помогите решить проблему, требуется в gif картинке черный цвет сменить на красный.
На bmp картинках все проходить нормально, я просто в цикле перебираю все пикселы и если натыкаюсь на черный то меняю этот цвет.
Имеит ли значение, если я в gif картинке использую всего два цвета прозрачный и черный?
Можно ли вообще работать с gif картинкой как с bmp? И как это организовать?
Отправлен: 06.09.2005, 19:45
Вопрос задал: Zeram (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Werewolf
Здравствуйте, Zeram!
Поищите компоненты для создания эффектов в рисунках.
В каком-то из них видел замену цвета.
Жаль не могу дать ссылку - давно это было =)
Удачи в поисках.
Ответ отправил: Werewolf (статус: 7-ой класс)
Отправлен: 07.09.2005, 00:44

Отвечает: Rusland
Здравствуйте, Zeram!
Попробуйте перевести gif-картинку в bmp (TBitmap) и далее работать с ней. Удачи.
---------
Тише едешь, дальше будешь... от того места куда едешь
Ответ отправил: Rusland (статус: Студент)
Отправлен: 07.09.2005, 09:26

Отвечает: Jadd
Здравствуйте, Zeram!
Объясняю. GIF, BMP, JPEG, TIFF - лишь форматы хранения битмапов с их атрибутами. Рисовать можно на любом из них. А прозрачный - это какой? В структуре BITMAPINFOHEADER, а точнее BITMAPV4HEADER есть поле для хранения AlphaMask для каждого пиксела. Альфа-каналы знакомый термин? Это и есть прозрачность. Так что рисуйте на здоровье, дорогой товарисчь.
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Практикант)
Отправлен: 07.09.2005, 10:20


Вопрос № 25.954
В модуле Classes (Delphi 6) объявлена переменная FindGlobalComponentProcs: TList. В приложении приведены процедуры и функции этого модуля, которые её используют. В finalization этого модуля последней строчкой записано FreeAndNil(FindGlobalComponentProcs), которая и выдаёт ошибку времени-выполнения при закрытии приложения. Порывшись деббагером, узнал, что ошибка "Invalid Pointer Operation". Теперь вопрос: За что отвечает эта переменная и в какой области мне искать ошибку в своём коде? (Приложение состоит из нескольких формочек и unit'ов - ничего экзотического - все компоненты и классы - стандартные). Спасибо
P. S. Извините, что не ставлю комментарии к оценке - пользуюсь оперой и комментарии не отправляются, хоть их и пишу.

Приложение:

Отправлен: 06.09.2005, 19:54
Вопрос задал: mvp (статус: 4-ый класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Маренич Владимир
Здравствуйте, mvp!

Судя по исходникам VCL переменная содержит список функций типа function (const Name: string): TComponent, которые должны возвращать указатель на глобальный компонент по имени. В частности используется в модуле Forms для контроля уникальности имени формы TForm или TDataModule (можете посмотреть Forms).
Если Вы добавили свою функцию поиска глобальных компонентов, то скорее всего там и следует искать. Может быть обращаетесь к объекту после его уничтожения (типичная ошибка, при которой получаем "Invalid Pointer Operation") или вообще NIL. Из вопроса не понятно зачем Вам это нужно...
Ответ отправил: Маренич Владимир (статус: 1-ый класс)
Отправлен: 06.09.2005, 22:04
Оценка за ответ: 4

Отвечает: Werewolf
Здравствуйте, mvp!
Поскольку FindGlobalComponentProc имеет тип TList (наследник TObject) можно вызвать метод FindGlobalComponentProcs.Free, который вызовет деструктор если указатель на объект <>nil
Пробуйте
Удачи.
Ответ отправил: Werewolf (статус: 7-ой класс)
Отправлен: 07.09.2005, 00:54
Оценка за ответ: 3

Отвечает: sir henry
Здравствуйте, mvp!
Как-то Вы все хитро запутали. :)
Ошибка выскакивает с ссылкой на ВАШ модуль?
На какую строку ругается? В сообщении должна стоять строка.
Почему Вы решили что Ваша ошибка из-за глюка в модуле Classes?
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 07.09.2005, 06:00


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

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

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Яндекс


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.delphiplus
Отписаться
Вспомнить пароль

В избранное