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

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


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

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

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

Выпуск № 359
от 19.01.2006, 01:12

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


Вопрос № 33175: Здравствуйте Уважаемые. Скажите, как можно программно скопировать текст из открытого окна, допустим Блокнота, и все скопированное поместить в буфер обмена ?...
Вопрос № 33177: Здравствуйте уважаемые эксперты! Не приходит мыслей, как можно сделать следующее 1. Имеется строка: Например: !32;0.00;0.00;-0.00;0.00;0.00;0.00;0.00;-0.00;47517 или может быть еще такой например !32;0.00;0.00;-0.00;0.00...
Вопрос № 33209: ; ("терминатор операторов") ведь можно не ставить перед end, а если поставить то повлияет ли это на эффективность компилируемого кода? И в каких случаях его ставят несколько раз (если ставят, конечно)?...

Вопрос № 33.175
Здравствуйте Уважаемые. Скажите, как можно программно скопировать текст из открытого окна, допустим Блокнота, и все скопированное поместить в буфер обмена ?
Отправлен: 13.01.2006, 11:16
Вопрос задал: Ramirez (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Ерёмин Андрей
Здравствуйте, Ramirez!
Смотрите пример в прикреплённом файле. Однако иногда этот способ может не срабатывать с первого раза - тогда действие нужно повторить. Для работы запустите программу, откройте Блокнот, наберите в нём что-нибудь и выделите нужный текст. После этого нажмите на кнопку. Выделенный текст должен появится в Label1. Универсальности, увы, здесь практически нет, - под каждое приложение нужно подстраиваться отдельно.

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

Ответ отправил: Ерёмин Андрей (статус: Профессионал)
Отправлен: 13.01.2006, 14:59

Отвечает: LanK
Здравствуйте, Ramirez!

:( хмм не понятно что ответили, а скачивать и смотреть нет времени.

На самом деле достаточно просто:
Алгоритм:

1. Найти чужое окно
FindWindow('TMessageForm', 'Warning')
BringWindowToTop(WndMain);

2. Найти на нем необходимое поле - Edit? Memo и т.д. перебором или если курсор (в вашем блокноте) уже стоит в поле ввода то 2. пропустить.

3. Сказать системе cnrl+a cntrl+c
keybd_event(VK_SHIFT, 0, 0, 0); //Нажимаем Shift
keybd_event(Ord('4'), 0, 0, 0); //Нажимаем 4 ($)
keybd_event(Ord('4'), 0, KEYEVENTF_KEYUP, 1); //Отпускаем 4 ($)
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0); //Отпускаем Shift
4. и всё - у RichEdit'а например
RichEdit1PasteFromClipboard;
---------
Пусть все будет хорошо! Давайте жить дружно! :) И будет жить еще лучше!
Ответ отправил: LanK (статус: 4-ый класс)
Отправлен: 13.01.2006, 16:58
Оценка за ответ: 4

Отвечает: Меркулов Алексей
Здравствуйте, Ramirez! Для получения информации с чужой программы используйте
SendMessage. ф для копирования в буфер - модуль Clipbrd(см приложение).

Приложение:

Ответ отправил: Меркулов Алексей (статус: 2-ой класс)
Отправлен: 13.01.2006, 22:43


Вопрос № 33.177
Здравствуйте уважаемые эксперты!
Не приходит мыслей, как можно сделать следующее

1. Имеется строка:
Например:
!32;0.00;0.00;-0.00;0.00;0.00;0.00;0.00;-0.00;47517
или может быть еще такой например
!32;0.00;0.00;-0.00;0.00;0.00;0.00;0.00;-0.00;4751

2. Из нее нужно извлечь отдельно
!32;0.00;0.00;-0.00;0.00;0.00;0.00;0.00;-0.00;
и
47517 (во втором случае 47517 и 4751)

Насколько я понимаю нужно при вырезании "отталкиваться" от последней ";" (перед 4751), чтобы вырезать перед ней текстовую часть и после нее.

Не могу найти универсальный алгоритм как это сделать подскажите пожалуйста.
Отправлен: 13.01.2006, 12:37
Вопрос задал: Александр_10289 (статус: Посетитель)
Всего ответов: 7
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Архангельский Андрей Германович
Здравствуйте, Александр_10289!

Читай классику!
Определи структуру данных - если это числа, то перегони их в таблицу и запросом твори с ними что хочешь, а результат перегони обратно в строку (если надо)

Если это строка (что глупо), то определи правило по которому она формируется (это опять структура данных)

И, наконец, если нужно отделить только последний элемент после ";", то определи позицию этого ";" и скопируй остатой куда надо
Посмотри в Help операторы Pos(), Copy()
Ответ отправил: Архангельский Андрей Германович (статус: Студент)
Отправлен: 13.01.2006, 12:50
Оценка за ответ: 2
Комментарий оценки:
Требовалась Ваша помощь в алгоритме, а не то, какие функции и процедуры использовать...

Отвечает: Minor
Здравствуйте, Александр_10289!
вот реализовал ваш замысел в процедурке....
пользуйтесь на здоровье ;)

Приложение:

---------
Не руби сук, на котором сидишь! Вообще слезь с дерева, человек!

Ответ отправил: Minor (статус: 2-ой класс)
Отправлен: 13.01.2006, 13:16
Оценка за ответ: 5
Комментарий оценки:
Большое спасибо, именно это мне и требовалось.

Отвечает: Ерёмин Андрей
Здравствуйте, Александр_10289!
Здесь можно сделать разными способами. Можно, например, просматривать символы от конца строки к началу, пока не найдётся ";". Вот этот способ:

procedure TForm1.Button1Click(Sender: TObject);
var S,S1,S2: String; I: Integer; Label St;
begin
S:='!32;0.00;0.00;-0.00;0.00;0.00;0.00;0.00;-0.00;47517';
I:=Length(S);
St:
if S[I] <> ';' then begin Dec(I); GoTo St; end else begin S1:=Copy(S,1,I); S2:=Copy(S,I+1,Length(S)); end;
Label1.Captio n:=S1;
Label2.Caption:=S2;
end;


---------
Работа - не волк, а произведение силы на расстояние!
Ответ отправил: Ерёмин Андрей (статус: Профессионал)
Отправлен: 13.01.2006, 14:33
Оценка за ответ: 4
Комментарий оценки:
Спасибо. Я попробую обойтись циклом, без метки.

Отвечает: Schmak
Здравствуйте, Александр_10289!
var s:string;
i:integer;
begin
readln(s);//s-входные данные
for i:=length(s) downto 1 do
if s[i]=';' then break;
writeln(copy(s,i+1,length(s)-i));//выходные данные
readln;
end.
---------
Не всё то Windows, что висит!
Ответ отправил: Schmak (статус: Практикант)
Отправлен: 13.01.2006, 16:34
Оценка за ответ: 5

Отвечает: Ataman N. N.
Здравствуйте, Александр_10289!
Попробуйте следуюющую процедуру:
procedure ExplitStr(StrIsx: String; var Str1, Str2: String);
var p: Integer;
S: String;
begin
S := StrIsx;
Str1 := '';
Str2 := '';
repeat
p := Pos(';', S);
Str1 := Str1 + Copy(S, 0, p);
Delete(S, 1, p);
until Pos(';', S) = 0;
Str2 := S;
end;
Это конечно не универсальный алгоритм, но я думаю Вы сможете подогнать его под свои нужды.
Ответ отправил: Ataman N. N. (статус: 5-ый класс)
Отправлен: 13.01.2006, 21:14
Оценка за ответ: 5

Отвечает: Меркулов Алексей
Здравствуйте, Александр_10289! Уточните: последовательность нулей имеет какую-либо закономерность в распределении или она постоянна?
Ответ отправил: Меркулов Алексей (статус: 2-ой класс)
Отправлен: 13.01.2006, 22:51

Отвечает: Diman_A
Здравствуйте, Александр_10289!
Функция LastPos находит место последнего вхождения подстроки в строку (в данном случае подстрокой является символ ;). Далее функцией copy забираем из исходной строки последние 4 символа, процедурой delete потом их удаляем.
Процедура Delete
Функция: Удаляет из строки подстроку.
Описание: Delete(var s : string; индекс : integer;
счетчик : integer)
Примечания: Параметр s представляет собой выражение
строкового типа. Параметры "индекс" и "счетчик" являются вы-
ражениями целого типа. Функция Delete удаляет символы, коли-
чество которых соответствует параметру "счетчик", начиная с
символа строки s, номер которого задан параметром "индекс".
Если значение параметра "индекс" превышает длину строки, то
символы не удаляются. Если параметр "счетчик" задает больше
символов, чем остается в строке, начиная с символа "индекс",
то удаляется остаток строки.
Функция Copy
Функция: Возвращает для строки подстроку.
Описание: Соpy(s : string; индекс : integer; счетчик :
integer)
Тип результата: Строковый (string).
Примечания: Параметр s - выражение строкового типа.
Па-раметры "индекс" и "счетчик" являются выражениями целого
типа. Функция Соpy возвращает строку, число символов которой
соответствует параметру "счетчик" и которая начинается с
символа строки s, номер которого задан параметром "индекс".
Если значение параметра "индекс" превышает длину строки, то
возвращается пустая строка. Если параметр "счетчик" задает
больше символов, чем остается в строке, начиная с символа
"индекс", то возвращается только остаток строки.
Функция Length
Функция: Возвращает динамическую длину строки.
Описание: Length(s : string)
Тип результата: Целый (integer).
Примечания: Параметр s представляет собой выражение
строкового типа. Результатом будет длина s.
Ответ на вопрос смотри в приложении.

Приложение:

Ответ отправил: Diman_A (статус: 3-ий класс)
Отправлен: 14.01.2006, 10:20
Оценка за ответ: 5


Вопрос № 33.209
; ("терминатор операторов") ведь можно не ставить перед end, а если поставить то повлияет ли это на эффективность компилируемого кода? И в каких случаях его ставят несколько раз (если ставят, конечно)?
Отправлен: 13.01.2006, 20:53
Вопрос задал: One (статус: 1-ый класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 13)

Отвечает: Архангельский Андрей Германович
Здравствуйте, One!

1) На эффективность кода не влияет. Либо компилятор распознает синтаксис и тогда компилирует, либо находит ошибку.
2) конструкция Begin ... end - если в ней один оператор, то можно не ставить ";" после оператора, но тогда и никчему делать эту конструкцию. Если операторов несколько, то лучше поставить ";" после каждого. В противном случае возможна "длинная" ошибка в виде неопределенного завершения IF, процедуры или функции.
3) Есть синтаксис языка и лучше его не нарушать, даже если отдельные компиляторы и допускают такие нарушения. Иначе проект будет зависить от конкретного компилятора - а это не есть хорошо.
Ответ отправил: Архангельский Андрей Германович (статус: Студент)
Отправлен: 13.01.2006, 21:19
Оценка за ответ: 3
Комментарий оценки:
Видимо, я нечётко сформулировал вопрос. Я спрашивал, компилируется ли ; в машинный код? Синтаксис я знаю.

Отвечает: sir henry
Здравствуйте, One!
Никакого более лучшего ответа, чем тот, который дан в описании языка, дать нельзя. ";" - это символ конца строки. На что тут можно заморачиваться? Его нельзя ставить перед ELSE. Во всех остальных случаях ставить либо нужно, либо можно. Нужен он исключительно для правильного парсинга, на эффективность не влияет. На эффективность влияет правильно разработаный алгоритм.
Ответ отправил: sir henry (статус: Академик)
Отправлен: 14.01.2006, 07:37
Оценка за ответ: 4
Комментарий оценки:
Я, кажется, нашёл ответ, в книжке В. Фаронова "Система программирования Delphi". Если я правильно понял, то:
begin
a := b;//- это символ конца строки
a := b;;;{- последние два ; это уже пустые операторы (аналог NOP в Ассемблере)}
a := b;{; поставленный перед end это тоже ПУСТОЙ ОПЕРАТОР}
end;
А ставят его в конец составного оператора, если надо поместить метку в последний (на end метку не поставишь). ;; - не имеют смысла. Просто мне было непонятно, я люблю, чтобы всё чётко было, вот и спросил.

Отвечает: Schmak
Здравствуйте, One!
; не компилируется это точно. Нужна она для разделения идущих друг за другом операторов. Т.к. после последнего оператора нет других, сразу end то и точку с запятой можно не ставить. Скорости это не прибавит и не убавит, код будет абсолютно идентичным. Можно проверить скомпилировав два одинаковых приложения, одно с ; другое без. Приложения получатся абсолютно одинаковыми как по размеру, так и по содержанию. Второй способ поставить брейкпоинт на последнюю строку, запустить приложение. Далее View>Debug windows>CPU (Ctrl+Alt+C). Вы увидите ассемблерный код. Для приложения со знаком и без он абсолютно одинаков.
---------
Не всё то Windows, что висит!
Ответ отправил: Schmak (статус: Практикант)
Отправлен: 14.01.2006, 11:02
Оценка за ответ: 5
Комментарий оценки:
Блестящий ответ! Спасибо.


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

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

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

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

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


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


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

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

В избранное