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

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


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

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

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

Выпуск № 176
от 10.07.2005, 07:00

Администратор:Калашников О.А.
В номере:Вопросов: 5, Ответов: 15


Вопрос № 22999: Здравствуйте. После различных экспирементов программы перестали реагировать на посылку сообщения о нажатие или отпускание клавиши Shift. Вместо этого после посылки нескольких сообщений (см. приложение) , если нажать правый шифт, возникает эффект ...
Вопрос № 23012: Уважаемые эксперты, у меня возникло несколько вопросов: 1.Как сделать,чтобы после нажатия кнопки производилось подключение к интернет,а после отправки сообщения на e-mail отключение? 2.На форме расположен MediaPlayer,который воспроизводит фай...
Вопрос № 23025: добрый день! вопрос про то, как достать информацию из буфера в программе на делфи. у меня программа копирует в буфер обмена какую-то информацию. Я хочу эту информацию взять из буфера и записать её в файл (свой файл), т.е. хочу получить данны...
Вопрос № 23037: Уважаемые эксперты! Подскажите, как сделать, чтобы готовая программа не просила библиотеку borlndmm.dll (я так понимаю, это Borland Memory Manager?) В Project - Options флажок Build with runtime libraries снят. Чего ему еще надо-то? Больше ничего не ...
Вопрос № 23058: Добрый день! спасибо за ваши ответы на вопрос 23025. Я действительно забыл создать объект TClipboard перед тем как вызывать метод OPEN. Но: я взял пустой проект, добавил туда uses clipbrd, добавил в раздел переменных c:TClipboard; добавил фо...

Вопрос № 22.999
Здравствуйте.
После различных экспирементов программы перестали реагировать на посылку сообщения о нажатие или отпускание клавиши Shift. Вместо этого после посылки нескольких сообщений (см. приложение) , если нажать правый шифт, возникает эффект залипания этой самой клавиши, отключается который после нажатия левого шифта. Подскажите пожалуйста как от этого избавиться.
Спасибо.

Приложение:

Отправлен: 04.07.2005, 08:04
Вопрос задал: Ivaan (статус: Посетитель)
Всего ответов отправлено: 1

Отвечает: Ерёмин Андрей
Здравствуйте, Ivaan!
Опять-таки можно сделать по-другому. Откройте любой текстовый редактор, нажмите [Shift], и, не отпуская его, [Вниз]. Текст выделится. После этого отпустите обе клавиши. Затем снова проделайте вышеописанные действия. Видите? Текст продолжает выделяться, т.е. нет необходимости всё время удерживать [Shift]. Отсюда совет:
for i:=1 to C do
begin
keybd_event(VK_SHIFT,0,0,0);
keybd_event(VK_DOWN,0,0,0);{Текст не выделяется}
keybd_event(VK_DOWN,0,KEYEVENTF_KEYUP,0);
keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
end;
Возможно, так будет работать. Ещё проблема может быть в том, что вы делаете это в цикле. Это не есть хорошо.
Кроме того, попробуйте в цикл добавить функцию Yield(). Возможно, будет нормально работать. Удачи!
---------
Если б не было бы глюка, жизнь была б такая скyка...
Ответ отправил: Ерёмин Андрей (статус: Студент)
Отправлен: 04.07.2005, 11:25


Вопрос № 23.012
Уважаемые эксперты, у меня возникло несколько вопросов:
1.Как сделать,чтобы после нажатия кнопки производилось подключение к интернет,а после отправки сообщения на e-mail отключение?
2.На форме расположен MediaPlayer,который воспроизводит файл.Как зациклить воспроизведение?
Заранее спасибо.

Приложение:

Отправлен: 04.07.2005, 10:57
Вопрос задал: Dovgotko (статус: Посетитель)
Всего ответов отправлено: 4

Отвечает: Ерёмин Андрей
Здравствуйте, Dovgotko Vadym Vit.!
2) MediaPlayer1.OnNotify:

With MediaPlayer1 Do
Begin
If NotifyValue = nvSuccessful Then
Play;
End;

---------
Если б не было бы глюка, жизнь была б такая скyка...
Ответ отправил: Ерёмин Андрей (статус: Студент)
Отправлен: 04.07.2005, 19:23

Отвечает: Delphin
Здравствуйте, Dovgotko Vadym Vit.!
2. У MediaPlayer'a есть свойство OnStop так вот на нем пиши уже Mediaplayer1.play;
1. Используй RasAPI. Справки в интернете как грязи.
---------
Обращаться в ICQ: 77778851 или E-Mail: delphinster@gmail.com
Ответ отправил: Delphin (статус: 7-ой класс)
Отправлен: 04.07.2005, 21:10

Отвечает: sir henry
Здравствуйте, Dovgotko Vadym Vit.!
По косвенным признакам (присутствие слов "подключение" и "отключение") у Вас стоит Dial-up. :)
Если у Вас одно-единственное соединение в Remote Access, то оно автоматом выбирется для подключения.
Для выбора подключения можно использовать функцию, приведеную в приложении (взято с сайта delphiworld.narod.ru).

Приложение:

Ответ отправил: sir henry (статус: Профессор)
Отправлен: 05.07.2005, 05:19

Отвечает: Tsechoev Bagaudin
Давай предупредим события, и купим тебе резиновую бабу вместо жены.
Ты хотя в чем-то разбираешься, я имею в виду в том что пишешь?!
Офигеть.!!!!
---------
Есть только одно зло - невежество, и только одно благо - знания
Ответ отправил: Tsechoev Bagaudin (статус: 6-ой класс)
Отправлен: 08.07.2005, 23:25
Оценка за ответ: 1
Комментарий оценки:
Да пошёл ты! Тоже мне умник нашёлся.Я уже разобрался ,нормальные люди помогли.Самому ,наверно ,тоже не приятно такие ответы получать.


Вопрос № 23.025
добрый день!
вопрос про то, как достать информацию из буфера в программе на делфи.
у меня программа копирует в буфер обмена какую-то информацию. Я хочу эту информацию взять из буфера и записать её в файл (свой файл), т.е. хочу получить данные из буфера просто в виде куска информации, последовательности байт. Я пробовал вставлять в компонент MEMO, чтобы получить информацию как текст, но ничего не выходит.
пробовал использовать компонент TClipboard, но при вызове метода OPEN прога вываливается с ошибкой.
Короче мне нужно взять кусок данных из Clipboard'а (а потом ещё надо будет их запихнуть обратно).
Пожалуйста, посоветуйте что-нибудь.
P.s. буду особенно рад решениям на winapi.
Отправлен: 04.07.2005, 13:46
Вопрос задал: Вiктор (статус: 3-ий класс)
Всего ответов отправлено: 5

Отвечает: Gin

Здравствуйте, Вiктор!

Делюсь примерами - сам не пробовал.

С Уважением, Gin.

Приложение:

Ответ отправил: Gin (статус: Студент)
Отправлен: 04.07.2005, 14:54

Отвечает: Jadd
Здравствуйте, Вiктор!
Вот пример из дельфового хелпа:
var
MyHandle: THandle;
TextPtr: PChar;
MyString: string;
begin
ClipBoard.Open;
try
MyHandle := Clipboard.GetAsHandle(CF_TEXT);
TextPtr := GlobalLock(MyHandle);
MyString := StrPas(TextPtr);
GlobalUnlock(MyHandle);
finally
Clipboard.Close;
end;
end;

Один только нюанс. Он у теюя падал при Open потому что ты его не создал. Т.е. прежде, чем его юзать, его нужно создать. Вот так:
Clipboard := TClipboard.Create;

Насчет WinAPI. Нет смысла лезть туда, если есть такой вот класс, который реализует мощь WINAPI. Но если уж интересно, тогда просто открой сырцы этого класса.
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Студент)
Отправлен: 04.07.2005, 15:56
Оценка за ответ: 5
Комментарий оценки:
спасибо, действительно забыл вызвать Create. Но: он у меня и на Create тоже вылетает... обидно... Наверно что-то невпорядке с делфи, а может не так вызывал...

Отвечает: Ерёмин Андрей
Здравствуйте, Вiктор!

Чтобы вставить в текущую позицию TMemo содержимое буфера обмена, следует просто вызвать процедуру PasteFromClipboard:

Memo1.PasteFromClipboard;

Чтобы работать с буфером обмена, необходимо подключить модуль Clipbrd.pas и объявить переменную типа TClipboard. Получить текстовые данные можно с помощью функции AsText. Записать их - с помощью SetTextBuf. Кроме того, можно задавать различный формат данных (текст, графика, мультимедиа и т.д.). API-функции для работы с буфером обмена: SetClipboardData, SetClipboardViewer, RegisterClipboardFormat, GetClipboardData, GetClipboardFormatName, GetClipboardOwner, GetClipboardViewer. Один из примеров работы с буфером обмена в приложении. В результате в Memo1 появится текст, который был в буфере обмена, а в буфер запишется заголовок формы Form1. Удачи!

Приложение:

---------
Если б не было бы глюка, жизнь была б такая скyка...

Ответ отправил: Ерёмин Андрей (статус: Студент)
Отправлен: 04.07.2005, 19:09
Оценка за ответ: 5
Комментарий оценки:
спасибо. А вот я тоже объявил C: TClipboard; потом вызвал c.create; и прога вылетела с ошибкой. Но меня теперь интересует не это, а другое. Я перспрошу в другом вопросе.

Отвечает: Delphin
Здравствуйте, Вiктор!
Если просто как текст то смотри приложение 1. Выдернул из своего проекта.
Если регестрация своих данных нужна то выдернул из сети смотри приложение 2.
Если работать к с массивом байт то выдернул из сети смотри приложение 3.

Приложение:

---------
Обращаться в ICQ: 77778851 или E-Mail: delphinster@gmail.com

Ответ отправил: Delphin (статус: 7-ой класс)
Отправлен: 04.07.2005, 21:08
Оценка за ответ: 5
Комментарий оценки:
спасибо за ответ. я не стал полностью использовать пример 3, но:
FHandle := GetClipboardData(FFormat);
FSize := GlobalSize(FHandle);
я у себя сделал такое же и программа зависла - когда решил узнать размер буфера обмена через GlobalSize. Я этот вопрос переспрошу.

Отвечает: sir henry
Здравствуйте, Вiктор!
Открывать клипборд нужно только если он предварительно закрыт.
Текст из него можно взять так:
TClipbord.GetTextBuf(Buffer: PChar; BufSize: Integer);
Buffer - куда записывается текст из клипборда,
BufSize - его размер :)
т.е. если Вам надо вытащить 10 символов из клипборда пишем:
var
buff: PChar;
Begin
Clipbord(buff, 10);
Edit1.Text:=StrPas(buff);
End;
Запихивается текст в клипборд методом:
TClipbord.SetTextBuf(Buffer: PChar);
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 05.07.2005, 05:31


Вопрос № 23.037
Уважаемые эксперты! Подскажите, как сделать, чтобы готовая программа не просила библиотеку borlndmm.dll (я так понимаю, это Borland Memory Manager?) В Project - Options флажок Build with runtime libraries снят. Чего ему еще надо-то? Больше ничего не просит, только эту dll... Спасибо за внимание. :-)
Отправлен: 04.07.2005, 15:56
Вопрос задала: L_Dorrit (статус: Посетитель)
Всего ответов отправлено: 3

Отвечает: John Freeman
Здравствуйте, L_Dorrit!
Само собой - это для юзания SharedMem и лёгкой передачи строк в dll
---------
You're trying to take me They trying to make me This is the only Gives me the only thing Tired of lying, I'm tired of lying The only thing I inderstand is what I feel...
Ответ отправил: John Freeman (статус: Профессор)
Отправлен: 04.07.2005, 16:13
Оценка за ответ: 5
Комментарий оценки:
Благодарю.

Отвечает: streetcat
Здравствуйте, L_Dorrit!
Проверь все строки используемых модулей (uses ...)
обычно такая фигня вылазит, если где-нить в uses стоит ShareMem
---------
WinERROR: Keyboard not detected. Press Enter to continue
Ответ отправил: streetcat (статус: 7-ой класс)
Отправлен: 04.07.2005, 18:58
Оценка за ответ: 5
Комментарий оценки:
Действительно... была такая ссылка. Ее удаление помогло... Спасибо.

Отвечает: Delphin
Здравствуйте, L_Dorrit!
Только не использовать эту бибилиотеку. Другого выхода нет. Все равно её придется таскать с собою что ты бы не поставил в настройка.
А она тебе ваще нужна?
---------
Обращаться в ICQ: 77778851 или E-Mail: delphinster@gmail.com
Ответ отправил: Delphin (статус: 7-ой класс)
Отправлен: 04.07.2005, 21:00
Оценка за ответ: 3
Комментарий оценки:
А я ее и не использую - напрямую, во всяком случае. Мне вот как раз и хотелось узнать, КАК ее не использовать.


Вопрос № 23.058
Добрый день!
спасибо за ваши ответы на вопрос 23025.
Я действительно забыл создать объект TClipboard перед тем как вызывать метод OPEN. Но: я взял пустой проект, добавил туда uses clipbrd, добавил в раздел переменных c:TClipboard; добавил форме обработчик create, в нём вызвал конструктор c.create; запустил - и прога вывалилась. Наверно какие-то проблемы с самим делфи...
а теперь к сути:
программа копирует в буфер обмена данные в своём формате.
я получаю адрес этой информации:
adres:=GetClipboardData(53429);
(53429 - clipboard format компонента, который я использую. Получил через EnumClipboardFormats(0) )
я посмотрел в дебаггере, это действительно то, что копируется программой. Но я не знаю длинны этого куска информации. А я хочу узнать размер скопированой информации, чтобы знать, сколько байт от полученного адреса мне записывать в файл. Пожалуйста, посоветуйте как узнать размер данных, хранящихся в буфере обмена.

в справке по SetClipboardData говорится что для этой функции надо выделять памяь через GlobalAlloc. Я решил узнать размер буфера через GlobalSize передав ему полученный из GetClipboardData адрес, но прога зависла.
Отправлен: 05.07.2005, 02:18
Вопрос задал: Вiктор (статус: 3-ий класс)
Всего ответов отправлено: 2

Отвечает: sir henry
Здравствуйте, Вiктор!
А Вы, интересно, хелп по клипборду прочитали? У меня создалось впечатление что нет. Там ведь черным по белому написано, что не надо создавать объект типа Clipboard с помощью Create, тогда Вы сможете использовать СИСТЕМНЫЙ clipboard куда, собственно, все проги и копируют свои данные.
53429 - это Ваш собственный формат? Тогда почему Вы не знаете его длины? Раз Вы его скопировали туда, то должны знать, что используете.
Может быть не стоит пока использовать функции WinAPI, а поработайте пока со стандартным объектом Дельфи Clipboard?
Может быть Вы все же напишете, что Вы передаете через Clipboard? Неужели не подойдет такая штука:
Edit1.Text:=Clipboard.AsText;
?
Если же Вы передаете через Clipboard какой-то свой компонент, то Вы просто ОБЯЗАНЫ знать его размер.
Чтобы узнать через функцию GlobalSize размер выделеной области памяти с таким-то адресом, Вы эту память сначала должны ВЫДЕЛИТЬ.
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 05.07.2005, 07:12

Отвечает: Jadd
Здравствуйте, Вiктор!
Да не c.create!!!! Я же написал как нужно вызывать. c := TClipboard.Create именно так и никак иначе. Ты же должен создавать экземпляр класса, а не собственной переменной. Как ты можешь вызвать create класса, которого еще нету в памяти?
ХЗ почему у тебя виснет. Но вот что в MSDN написано насчет GlobalSize:Note The global functions are slower than other memory management functions and do not provide as many features. Therefore, new applications should use the heap functions. Ну с хиповыми функциями ты добавишь немного гиморра, хотя это вотпрос - открытый. Но дальше там пишется:The size of a memory block may be larger than the size requested when the memory was allocated.
To verify that the specified object's memory block has not been discarded, use the GlobalFlags function before calling GlobalSize.

Я у себя в дельфе попробовал все сделать, как в примерах из хелпа написано и у меня ни разу не зависло, и сработало как нужно. GlobalSize без зависонов показала правильный размер скопированного в буфер. Ищи у себя причину.

---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Студент)
Отправлен: 05.07.2005, 10:33


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

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

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

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

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


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


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

Яндекс


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

В избранное