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


Автор: BLACK_KOT 15.1.2011, 02:47
Код

  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;


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

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

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

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

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

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

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


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

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


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

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

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


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

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

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

Автор: BLACK_KOT 23.1.2011, 12:19
если б алгоритм был содран - он хотябы работал.

Код

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);

Автор: Poseidon 23.1.2011, 14:15
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, если можно все стандартно сделать?

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

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