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

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


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

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

Выпуск № 466
от 07.05.2006, 22:35

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


Вопрос № 41830: Уважаемые Эксперты! Подскажите пожалуйста алгорит поиска пути (типа А стар. или волновой троссировки), который НЕ ИЩЕТ ПУТЬ ПО ДИАГОНАЛИ. Заранее спасибо. ...
Вопрос № 41868: Добрый день. Есть вопрос. Хочу реализовать програмку, но не знаю как это сделать. Вот в чем вопрос. Програма весит в памяти. Когда нажимается определенная сочетание клавиш то она запоминает выделенный текст. Вопрос вот в чем. Как сделать ...
Вопрос № 41878: Здравствуйте, эксперты! Подскажите, п-та, как организовать запуск *.exe в приложении....
Вопрос № 41894: Нужно создать прогу на подобие планировщика задач. Думаю сделать ее сервисом который в определеном времени делал какието задачи, но не слишком ето загрузит систему? Подскажите метод....
Вопрос № 41910: Здраствуйте уважаемые эксперты Мне нужно написать програмку которая запустила бы другую програмку (md5inside) сэмулировать нажатие F5 клавиши в этой программе и через 5 минут програмно закруть эту программу (какбы нажать крестик в верхнем углу.)<...

Вопрос № 41.830
Уважаемые Эксперты!

Подскажите пожалуйста алгорит поиска пути (типа А стар. или волновой троссировки), который НЕ ИЩЕТ ПУТЬ ПО ДИАГОНАЛИ.

Заранее спасибо.
Отправлен: 01.05.2006, 22:46
Вопрос задал: Golden Spider (статус: 5-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Решетник Д
Здравствуйте, Golden Spider!
Когда-то делал лабу по программированию - алгоритм Дейкстры (Дэйкстра).
Но кода не осталось.
Также, может, поиск в ширину и в длину
---------
Жизнь коротка, чтобы писать на ассемблере
Ответ отправил: Решетник Д (статус: 4-ый класс)
Ответ отправлен: 02.05.2006, 19:11
Оценка за ответ: 5
Комментарий оценки:
Вроде бы слышал что то по Дейктры... Нужно проверить...


Вопрос № 41.868
Добрый день.
Есть вопрос. Хочу реализовать програмку, но не знаю как это сделать.
Вот в чем вопрос. Програма весит в памяти. Когда нажимается определенная сочетание клавиш то она запоминает выделенный текст.
Вопрос вот в чем. Как сделать чтобы программа реагирыола на определенное сочетание клавиш.
Вопрос второй, как узнать выделеный текст, не важно в каком редакторе находишся.
Если есть примеры былобы не плохо. Жду различных предложений.
Всем заранее спасибо.
Работаю на делфи.
Отправлен: 02.05.2006, 13:56
Вопрос задал: AllexZ (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Coupler
Здравствуйте, AllexZ!
Чтобы прога реагировала на нужное сочетание клавиш, нужно зарегистрировать системную горячую клавишу:
Создание системных горячих клавиш (ctrl+alt+F12):
RegisterHotkey(Handle, 1, mod_alt or mod_control, vk_f12);
Их обработка:
procedure TForm1.WMHotkey( var msg: TWMHotkey );
begin
if msg.hotkey = 1 then
begin
{ваши действия}
BringToFront;
end;
end;
Не забудьте поместить procedure WMHotkey( var msg: TWMHotkey ); message WM_HOTKEY; в секцию private.
В задаче копирования выд.текста предлагаю идти по пути наименьшего сопротивления: узнать хендл активного окна и послать ему ctrl+с. Так поступает известная прога Punto Switcher. Если же вас это не устраивает, почитайте статьи на delphiworld (www.delphiworld.narod.ru), там много чего есть. Все вопросы - в мини-форум или на внутреннюю почту.
Ответ отправил: Coupler (статус: 9-ый класс)
Ответ отправлен: 02.05.2006, 15:17
Оценка за ответ: 5
Комментарий оценки:
Большое спасибо.
Тогда вопрос еще как послать сообщение "ctrl+с".
И еще вопрос, как определить хендел активного окна.
Как считать даные из буфера?

Отвечает: Решетник Д
Здравствуйте, AllexZ!
Вариант 1.
(Самый легкий).
Использовать registerhotkey для отловки нажатия клавиш. а при нажатии на комбинацию посылать в активное окно комбинацию Ctrl+C / Ctrl+Insert.
sendmessage(GetActiveWindow, WM_KEYDOWN, VK_CONTROl, 0);
sendmessage(GetActiveWindow, WM_KEYDOWN, ord('c'), 0);
sendmessage(GetActiveWindow, WM_KEYUP, VK_CONTROl, 0);
sendmessage(GetActiveWindow, WM_KEYUP, ord('c'), 0);
(если честно, то, вроде, он не работает)
Вариант 2.
Поставить системную глобальную ловушку (смотреть SetWindowsHook и WH_KEYBOARD). Так как все текстовые окна - наследники Edit'a, то можно перебирать ВСЕ компоненты (дочерние - FindWindowEx) типа поле редактирования, и посылаю каждому сообщение WM_COPY, поочередно обрабатывать буфер обмена.
--------------------------
если что - пишите на внутренне мыло
---------
Жизнь коротка, чтобы писать на ассемблере
Ответ отправил: Решетник Д (статус: 4-ый класс)
Ответ отправлен: 02.05.2006, 18:57
Оценка за ответ: 4
Комментарий оценки:
Проверем на работу первого варианта.
А как можно работать с буфером?


Вопрос № 41.878
Здравствуйте, эксперты!
Подскажите, п-та, как организовать запуск *.exe в приложении.
Отправлен: 02.05.2006, 15:35
Вопрос задал: Ramil (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Jeka911
Здравствуйте, Ramil!

Смотрите в хелпе ф-ю ShellExecute(..;
---------
Шахтер - чемпион!!!
Ответ отправил: Jeka911 (статус: 2-ой класс)
Ответ отправлен: 02.05.2006, 16:33

Отвечает: Denisss

Здравствуйте, Ramil!

Мне известно три метода:
1. Через ShellExec (см. предыдущий ответ)
2. WinExec - функция прописана в модуле Windows.pas
Пример:

var
Exe: string;
begin

// Путь к файлу (может быть как полный, так и относительный
  Exe:= 'explorer.exe';
// Запуск программы из файла
// Функция имеет два параметра:
// 1. Путь к программе (в том числе и с параметрами запуска)
// 2. Способ вывода окна (см. предыдущий ответ)

  WinExec(PChar(Exe), SW_SHOWNORMAL);
end;

3. Через CreateProcess - использование функции более сложное. Полностью всех ее параметров описывать не буду, просто приведу простейший пример с некоторыми комментариями (за подробностями рекомендую лезть в MSDN и там искать).
Пример:

var
  lpStartUpNfo: TStartupInfo;
  lpProcessInformation: TProcessInformation;
  Exe, Path: string;
begin

// Опустошаем lpStartUpNfo
  ZeroMemory(@lpStartUpNfo, sizeof(lpStartUpNfo));
// Путь к программе
  Exe:= 'explorer.exe';
// Рабочая папка программы
  Path:= 'c:windows';
// заполняем lpStartUpInfo
  with lpStartUpNfo do
  begin

    cb:= sizeof(lpStartUpNfo);
// STARTF_USESHOWWINDOW - означает, что мы заполнили
// свойство wShowWindow и его надо проверить

    dwFlags:= STARTF_USESHOWWINDOW;
// См. предыдущий ответ
    wShowWindow:= SW_SHOWNORMAL;
  end;
// Если не удалось выполнить программу
  if not CreateProcess(nil, PChar(Exe), nil,
    nil, false, CREATE_NEW_CONSOLE or
// Приоритет запуска - нормальный
   NORMAL_PRIORITY_CLASS,
    nil, PChar(Path), lpStartUpNfo, lpProcessInformation)
  then
// Если что, то выдаем код ошибки
    MessageBox(Handle, PChar('Произошла ошибка с кодом: ' +
      IntToStr(GetLastError)), nil, 0)
  else
// Закрываем хэндл
    CloseHandle(lpProcessInformation.hProcess);
end;

Удачи!
Ответ отправил: Denisss (статус: Специалист)
Ответ отправлен: 02.05.2006, 16:47
Оценка за ответ: 5


Вопрос № 41.894
Нужно создать прогу на подобие планировщика задач. Думаю сделать ее сервисом который в определеном времени делал какието задачи, но не слишком ето загрузит систему? Подскажите метод.
Отправлен: 02.05.2006, 18:17
Вопрос задал: Negruzzi Cristian (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Jeka911
Здравствуйте, Negruzzi Cristian!

Я думаю не слишком загрузит, если выполнять задачи по таймеру.
Т.е. находить задачи для выполнения, например раз в минуту.
---------
Шахтер - чемпион!!!
Ответ отправил: Jeka911 (статус: 2-ой класс)
Ответ отправлен: 02.05.2006, 19:14

Отвечает: Решетник Д
Здравствуйте, Negruzzi Cristian!
Если на компе стоит ХР, то точно не загрузит.
Для определения времени просто нужно (один из вариантов):
1 создать список задания.
2 отсортировать их убыванию
3 поставить таймер на самый ранний

Так при удалении (выполнении) задания, нужно будет устанавливать таймер на след элемент.
Проблемы:
Пользователь переставил время. Это отслеживается при помощи WM_TIMECHANGE (при этом нужно только переинициализировать таймер).

установка таймера:
SetTimer(handle, ID, time, nil)
ID - номер таймера
time - количество миллисекунд для отсчета.

событие таймера:
..
public
...
procedure wmtimer(var msg: TMessage); message WM_TIMER;
..
procedure TForm1.wmtimer(var msg: TMessage);
begin
if msg.wParam = ID then
begin
<сделать что-то>
killtimer(handle, ID);
InitNextTimer;
end;
end;

---------
Жизнь коротка, чтобы писать на ассемблере
Ответ отправил: Решетник Д (статус: 4-ый класс)
Ответ отправлен: 02.05.2006, 20:13

Отвечает: Kazakh
Здравствуйте, Negruzzi Cristian!
Как вариант, если заданий не очень много
Я думаю должна некая структура типа
"Список_задач
Время_запуска Активно Наименование Действие Примечание ... ... "
Заполняется .... Потом сортируется по Времени_запуска.

1. И у обычного TTimer задается интервал Время_запуска-тек_время.
2. Потом ОнТаймер выполняем Действие
3. Помечаем как Активно:=False
4. Берем следуещее самое ранне задание и пункт 1.
если нет активных то выход.

---------
Если собеседник затрудняется ответить, значит, вопрос поставлен правильно.
Ответ отправил: Kazakh (статус: 7-ой класс)
Ответ отправлен: 03.05.2006, 08:18
Оценка за ответ: 4


Вопрос № 41.910
Здраствуйте уважаемые эксперты
Мне нужно написать програмку которая запустила бы другую програмку (md5inside) сэмулировать нажатие F5 клавиши в этой программе и через 5 минут програмно закруть эту программу (какбы нажать крестик в верхнем углу.)
Я никак немогу сэмулировать нажатие F5 и програмно закрыть приложение, помогите мне пожалуйста.
Заранее спасибо.
Отправлен: 02.05.2006, 21:29
Вопрос задал: Станислав (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Лучников Ю.В.
Здравствуйте, Станислав!

В прикрепленном к ответу архиве находится пример проекта, который запускает стандартный калькулятор, нажимает в нем F5 и через 10 секунд его закрывает...

Переделать пример под ваши нужды проблем думаю не составит;)
Успехов!

Прикреплённый файл: Загрузить >>
Срок хранения файла на сервере RusFAQ.ru составляет 30 суток с момента отправки ответа.

Ответ отправил: Лучников Ю.В. (статус: *Мастер-Эксперт)
Россия, Киров
WWW: нЧат - Наш Чат!
ICQ: 176308580
----
Ответ отправлен: 03.05.2006, 23:49


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

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

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

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

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


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


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.32 от 03.05.2006
Яндекс Rambler's Top100

В избранное