Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Проблема с TEdit в сервисе


Автор: Darbort 7.5.2006, 18:40
Я пишу программу, которая работатет, как сервис. В сервисе есть поле (TEdit) в которое нужно ввести данные, НО при нажатии на клавиши в поле ничего не печатается! Причём копки "Delete", "Home", "End"  прекрасно работают (контекстное меню работает, если вставить с помощью него текст, то всё прекрасно отображается). Проблема не только с TEdit, но и с остальными стандартными компонентами ввода.
Сервис делал стандартными средствами Delphi.
Можно ли что-нибудь сделать?... 

Автор: Poseidon 7.5.2006, 18:57
Цитата(Darbort @  7.5.2006,  18:40 Найти цитируемый пост)
Можно ли что-нибудь сделать?...  
 Можно. Семнадцатую строчку попровь  smile 
 

Автор: Демо 7.5.2006, 19:05
Цитата(Darbort @  7.5.2006,  18:40 Найти цитируемый пост)
Можно ли что-нибудь сделать?... 

Не писать сервисы с формами ввода. 

Автор: Darbort 7.5.2006, 20:50
Спасиб пацаны, вы здесь все такие умные?  smile  

Автор: Демо 7.5.2006, 21:20
Цитата(Darbort @  7.5.2006,  20:50 Найти цитируемый пост)
Спасиб пацаны, вы здесь все такие умные?


Я тебе ответил максимально точно и корректно.

Коли после этого у тебя только такие вопросы возникают, то что ж тут поделаешь. 

Автор: Dimannn 7.5.2006, 21:35
Цитата(Darbort @  7.5.2006,  18:40 Найти цитируемый пост)
Сервис делал стандартными средствами Delphi.


Это как именно?
Скорее всего не принимаюся сообщения для окон.

Прочти http://forum.vingrad.ru/index.php?showtopic=15895&view=findpost&p=104353 

Автор: Darbort 7.5.2006, 23:28
Цитата

ошибка в 17 строке... однозначна...  

Какой тут код приводить? SvcMgr.pas постить что ль? smile
Цитата

  Не писать сервисы с формами ввода.  

Это выход? Не смеши...

- Я не умею плавать.
- Так не учись...

Тоже самое по-моему.
Самому не нравится в сервисе форму юзать, но по другому ещё хуже smile

Цитата

Это как именно?


File->New->Other...
Потом ServiceApplication

В общем я пока понял, что не обрабатываеются сообщения WM_CHAR;
Попробывал сделать так:
Бросил TTimer на форму и в OnTimer:
Код

var
  msg: TMSG;
begin
  GetMessage(msg,handle,0,0);
  TranslateMessage(msg);
  DispatchMessage(msg);
  Edit1.Broadcast(msg);
end;


Как ни странно заработало smile НО, как и следовало ожидать всё кроме ввода очень сильно тормозит...

Появилась идея не перехватывать всё в подрят, а только нужное smile
То есть procedure HKlav(var msg: TMessage); message WM_CHAR;

Но на WM_CHAR он не реагирует, может какое ещё сообщение?  

Автор: Демо 8.5.2006, 01:00
Цитата(Darbort @  7.5.2006,  23:28 Найти цитируемый пост)
Это выход? Не смеши...

- Я не умею плавать.
- Так не учись...


Именно выход.
Сервис не предназначен для программирования с VCL. И вообще для оработы с окнами.

А если ты хочешь все-таки писать интерфейс с пользователем именно в сервисе - забудь про VCL. Да и это будет "через задний проход".
 

Автор: XSInet 8.5.2006, 04:36
Цитата

var
  msg: TMSG;
begin
  GetMessage(msg,handle,0,0);
  TranslateMessage(msg);
  DispatchMessage(msg);
end;


Это делается в while цикле. Пиши на WinAPI 

Автор: Darbort 8.5.2006, 08:24
Согласен, это просто извращение писать сервис с VCL...
В общем или WinAPI или на два приложения разделять (через мессаги им общатся, кста никто не знает, как через пайпы параметры передавать? Возможно ли это? Проверить на вторую копию легко, а с передачей что-то не выходит), то есть два раза "через задний проход" smile
Цитата

Это делается в while цикле.

Ну, если я сделаю так, то прога будет бесконечно долго в подвешенном состоянии smile , так как TApplication в SvcMgr.pas занимается тем же самым... Если на WinAPI, то ясный пень while...
Всё же ещё помучась... прям загадка, даже OnKeyDown для TEdit сробатывает, а дальше ни в какую.
Как всегда  smile  

Автор: Guedda 8.5.2006, 08:26
Цитата(Darbort @  8.5.2006,  09:24 Найти цитируемый пост)
бесконечно долго в подвешенном состоянии

Можно это обойти, написав:
Код

ProcessMessages;

 smile  

Автор: Darbort 8.5.2006, 08:40
Цитата

Можно это обойти, написав:
ProcessMessages;


Нет, ну вы меня окончательно прикалываете smile
У TApplication в  SvcMgr.pas НЕТ ProcessMessages!
Если использовать TApplication из Forms, то процедура ProcessMessages работает не корректно, если не сказать вообще не работает. То есть буковки печатаются, а всё остальное виснет включая рабочий стол... smile 

Автор: Демо 8.5.2006, 12:19
Цитата(Darbort @  8.5.2006,  08:24 Найти цитируемый пост)
Согласен, это просто извращение писать сервис с VCL...


Писать сервис в VCL - не извращение.
Извращение - писать сервис с пользовательским интерфейсом.

Я ж написал - если тебе так нужен интерфейс с пользователем в сервисе - реализуй этот интерфейс в окнах WinAPI32.

Тебе нужна глючная программа? - Тогда используй VCL для этого.

Добавлено @ 12:19 
А давать советы для написания заведомо глючной программы - уволь. 

Автор: Darbort 8.5.2006, 15:33
Увольняю  smile 
Спасиб всем. 

Автор: Dimannn 15.5.2006, 17:39
Цитата(Демо @  8.5.2006,  12:19 Найти цитируемый пост)
Тебе нужна глючная программа? - Тогда используй VCL для этого.

Я писал - у меня всё было нормально, ничё не глючило. 

Автор: Демо 15.5.2006, 17:43
Цитата(Dimannn @  15.5.2006,  17:39 Найти цитируемый пост)
Я писал - у меня всё было нормально, ничё не глючило.


Вряд ли.
Приведи пример.

Добавлено @ 17:46 
Добавлю, что глюки VCL-форм в дополнительном потоке гарантированы без всяких примеров. 

Автор: Dimannn 15.5.2006, 17:52
Создаём сервис, создаём форму, в онстарт пишем Form1.Show и радуемся...
Я путался фтп-сервер запихнуть, он у мменя нормально работал 

Автор: Демо 15.5.2006, 21:27
Dimannn

Я бы все-таки предложил тебе запостить код самого простого примера с формой в сервисе, чтобы можно было говорить предметно. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)