Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема со вставкой текста из буфера 
:(
    Опции темы
BLACK_KOT
Дата 15.1.2011, 02:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 20.12.2006

Репутация: нет
Всего: -1



Код

  AssignFile(f,s+'\1.txt');
  Reset(f);
  While not eof(f) do
    begin
    ReadLn(f,s1);
    if s1<>'' then
      begin
        if s1[1]='т' then
        begin
        s3:=copy(s1,7,length(s1)-6);
        SetClipboardText(hWnd,s3);
        keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);
        keybd_event(Ord('V'), MapVirtualKey(Ord('V'), 0), 0, 0);
        keybd_event(Ord('V'), MapVirtualKey(Ord('V'), 0), KEYEVENTF_KEYUP, 0);
        keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0);
        beep(100,100);
        end;
  end;  end;


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

текст ааа
прочаяабракадабра
текст ббб
прочаяабракадабра
текст ввв

то вставится "ввв ввв ввв"
насколько я понял вставка просто не успевает скопироваться и ввестись, как цикл уже пробежал и в буфер попало последнее удовлетворяющее условие. хотя я сам не до конца понимаю. подскажите, как избавиться от такого эфекта?


--------------------
                       .. я - демо версия Бога от Microsoft..
PM MAIL   Вверх
Poseidon
Дата 17.1.2011, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



А потому что надо сначало "собрать" весь текст в переменной, а потом уже скопировать все в буфер за один раз.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
BLACK_KOT
Дата 22.1.2011, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 20.12.2006

Репутация: нет
Всего: -1



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


--------------------
                       .. я - демо версия Бога от Microsoft..
PM MAIL   Вверх
Poseidon
Дата 23.1.2011, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Цитата(BLACK_KOT @  22.1.2011,  18:52 Найти цитируемый пост)
в буфер скопировалось аааббббвв.как мне достать бббб?

По-моему это немного не вяжется с 
Цитата(BLACK_KOT @  15.1.2011,  02:47 Найти цитируемый пост)
если в тексте находим строку, начинающуюся с нужной буквы- копируем в буфер и вставляем где сейчас курсор. 


Вот ты привел конкретный пример

Цитата
текст ааа
прочаяабракадабра
текст ббб
прочаяабракадабра
текст ввв


твой алгоритм вырывает отсюда "ааабббввв" и нужно это вставить туда. где курсор. При чем тут теперь "как мне достать бббб?" Ну через pos достань. Через регулярки smile Изначально то ведь вопрос был "почему не копируется то, что надо".


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
BLACK_KOT
Дата 23.1.2011, 02:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 20.12.2006

Репутация: нет
Всего: -1



я ж говорю- алгоритм находит строчку - копирует в буфер и вставляет где сейчас курсор. беда в том, что вместо первой строки, второй и третей вставляется во всех случаях третья строка.
например
распознание такого кода приведённым выше аглоритмом будет следущее:

клик 100 200 //эмулируется клик мышкой в точке с этими координатами.
текст Т1 // в буфер копируется  "Т1",эмуляция нажатия контрл+V   (должен вставляться  Т1, а вставляется Т3)
клик 200 300 // эмулируется клик мышкой в точке с этими координатами.
текст Т2 // в буфер копируется "Т2",эмуляция нажатия контрл+V  (должен вставляться  Т2, а вставляется Т3)
клик 300 400 // эмулируется клик мышкой в точке с этими координатами.
текст Т3 // в буфер копируется "Т3",эмуляция нажатия контрл+V  (должен вставляться  Т3, он и вставляется)



Это сообщение отредактировал(а) BLACK_KOT - 23.1.2011, 02:29


--------------------
                       .. я - демо версия Бога от Microsoft..
PM MAIL   Вверх
northener
Дата 23.1.2011, 03:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(BLACK_KOT @  23.1.2011,  02:28 Найти цитируемый пост)
я ж говорю- алгоритм находит строчку - копирует в буфер и вставляет где сейчас курсор

Пожалуйста без пошлостей! smile

А где сам алгоритм?
Есть код явно "содранный" откуда-то. Нам что нужно его "довести до ума"?



--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
BLACK_KOT
Дата 23.1.2011, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 20.12.2006

Репутация: нет
Всего: -1



если б алгоритм был содран - он хотябы работал.

Код

AssignFile(f,s+'\1.txt');
  Reset(f);
  While not eof(f) do
    begin
    ReadLn(f,s1);
    if s1<>'' then
      begin
      if (s1[1]='к')and(s1[2]='л') then
        begin
        s2:=copy(s1,6,length(s1)-5);
        for i:=1 to length(s2) do if s2[i]=' ' then SetCursorPos(StrToInt(copy(s2,1,i-1)),StrToInt(copy(s2,i+1,length(s2)-i)));
        mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
        mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
        end;
      if s1[1]='т' then
        begin
        s3:=copy(s1,7,length(s1)-6);
        //CopyStringToClipboard(s3);
        //Clipboard.AsText:=s3;
        SetClipboardText(Form1,s3);
        SetWindowText(Form1,pchar(s3));
        keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);
        keybd_event(Ord('V'), MapVirtualKey(Ord('V'), 0), 0, 0);
        keybd_event(Ord('V'), MapVirtualKey(Ord('V'), 0), KEYEVENTF_KEYUP, 0);
        keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0);
        beep(100,100);
        end;
      if s1[1]='п' then
        begin
        s3:=copy(s1,7,length(s1)-6);
        Sleep(StrToInt(s3));
        end;
      if (s1[1]='к')and(s1[2]='о') then
        begin
        s3:=copy(s1,9,length(s1)-8);
        ShellExecute(ABM_NEW, 'open', pchar(s3), nil, nil,ABM_REMOVE);
        end;
      if (s1[1]='к')and(s1[2]='н') then
        begin
        s3:=copy(s1,8,length(s1)-7);                                                  
        keybd_event(StrToInt(s3), MapVirtualKey(StrToInt(s3), 0), 0, 0);
        keybd_event(StrToInt(s3), MapVirtualKey(StrToInt(s3), 0), KEYEVENTF_KEYUP, 0);
        end;
      end;
    end;
  CloseFile(f);



--------------------
                       .. я - демо версия Бога от Microsoft..
PM MAIL   Вверх
Poseidon
Дата 23.1.2011, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



BLACK_KOT, ты меня удивляешь. Уже ж не первый год с Дельфи знаком.

Вот твой первый пример, работающий. Проверял на D XE

Код
uses Clipbrd;
procedure TForm1.Timer1Timer(Sender: TObject);
var
  f: TextFile;
  s1, s3, clptext: string;
begin
  clptext:= '';
  AssignFile(f,'D:\1.txt');
  Reset(f);
  While not eof(f) do
  begin
    ReadLn(f,s1);
    if s1[1]='т' then
    begin
      s3:=copy(s1,7,length(s1)-6);
      clptext:= clptext + s3;
      beep;
    end;
  end;
  Clipboard.AsText:= clptext;

  keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);
  keybd_event(Ord('V'), MapVirtualKey(Ord('V'), 0), 0, 0);
  keybd_event(Ord('V'), MapVirtualKey(Ord('V'), 0), KEYEVENTF_KEYUP, 0);
  keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0);
end;


запихнул в таймер, что бы было время переключится на другое окно и поставить куда-нить курсор.

Кстати, чем обусловлено использование "левой" SetClipboardText, если можно все стандартно сделать?


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
BLACK_KOT
Дата 26.1.2011, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 20.12.2006

Репутация: нет
Всего: -1



спасибо, Poseidon, с VCL действительно работает. беда в том что я пишу на winapi, потому и использую "левые" функции, которые меня и подводят.


--------------------
                       .. я - демо версия Бога от Microsoft..
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0535 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.