Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.02.05;
Скачать: CL | DM;

Вниз

Поиск в Memo   Найти похожие ветки 

 
samsung   (2011-10-30 00:54) [0]

Всем здраствуйте!!!
Не пойму как сделать поиск в Memo.
Посмотрите пожалуйста.
В поле Memo отображается выполнение команд из (Edit),(Edit1),(Edit2),(Edit3),(Edit5)
Искомую строку  пишу в Edit4.
Нужно отследить каждый приход строки в Memo (поиск из Edit4) и при каждом появлении её в

Memo
вводить команду из edit5.
Бьюсь но ни как не получается сделать поиск строки из Edit4
Вот набросал, но не находит ,что то делаю не так.
Спасибо!!!!

procedure TFormComPort.SpeedButtonSendClick(Sender: TObject);
begin
 bComPort1.WriteStr(Edit.Text + #13);
          sleep(1000);
    bComPort1.WriteStr(Edit2.Text + #13);
          sleep(1000);

bComPort1.WriteStr(Edit1.Text + #13);    
sleep(1000);

    bComPort1.WriteStr(Edit3.Text + #13);
          sleep(1000);
 end;

  procedure TFormComPort.BComPort1RxChar(Sender: TObject; Count: Integer);
var
      S: String;
       Find:string; // Искомая строка
       i:integer;
begin
  BComPort1.ReadStr(S, Count);
 if S[Length(S)] = #13 then // Добавление перевода строки
   S := S + #20;
 memo.Text := memo.Text + s;
   begin
    find:=Edit4.Text; // Записываем в find текст из Edit
      For i:=0 to Memo.Lines.Count-1 do // Запускаем цикл поиска строки
If Pos(FIND, Memo.Lines.Text)<>0
Then
bComPort1.WriteStr(Edit5.Text + #13);
          sleep(1000);
 end;
end;


 
Германн ©   (2011-10-30 01:13) [1]


> For i:=0 to Memo.Lines.Count-1 do // Запускаем цикл поиска
> строки
> If Pos(FIND, Memo.Lines.Text)<>0

Что за бред?


 
Омлет ©   (2011-10-30 11:20) [2]

Что-то ком-порты нынче в тренде..

> samsung   (30.10.11 00:54)

Мало что понял. Код ваш реально бредовый. Срочно читать учебники!

Ниже - код поиск в memo с учетом опций FindDialog. Не помню откуда, но я вроде бы правил немного:

function SearchBuf(Buf: PAnsiChar; BufLen: Integer; SelStart, SelLength: Integer;
 SearchString: AnsiString; Options: TFindOptions): PAnsiChar;
const
 WordDelimiters: set of AnsiChar =
   [ #0..#255] - ["a".."z","A".."Z","0".."9","А".."Я","а".."я","ё"];
var
 C: AnsiChar;
 Direction: Shortint;
 SearchCount, I: Integer;
 CharMap: array [AnsiChar] of AnsiChar;

 function FindNextWordStart(var BufPtr: PAnsiChar) : Boolean;
 begin              
   while (SearchCount > 0) and ((Direction = 1) xor (BufPtr^ in WordDelimiters)) do begin
     Inc(BufPtr, Direction);
     Dec(SearchCount);
   end;
   while (SearchCount > 0) and ((Direction = -1) xor (BufPtr^ in WordDelimiters)) do begin
     Inc(BufPtr, Direction);
     Dec(SearchCount);
   end;
   Result := SearchCount > 0;
   if Direction = -1 then begin
     Dec(BufPtr, Direction);
     Inc(SearchCount);
   end;
 end;

begin
 Result := nil;
 if BufLen <= 0 then Exit;
 if frDown in Options then
 begin
   Direction := 1;
   Inc(SelStart, SelLength);  
   SearchCount := BufLen - SelStart - Length(SearchString);
   if SearchCount < 0 then Exit;
   if Longint(SelStart) + SearchCount > BufLen then Exit; end
 else begin
   Direction := -1;
   Dec(SelStart, Length(SearchString));
   SearchCount := SelStart+1;
 end;
 if (SelStart < 0) or (SelStart > BufLen) then Exit;
 Result := @Buf[SelStart];

 for C := Low(CharMap) to High(CharMap) do CharMap[C] := C;
 if not (frMatchCase in Options) then begin
   AnsiUpperBuff(PChar(@CharMap), sizeof(CharMap));
   AnsiUpperBuff(@SearchString[1], Length(SearchString));
 end;
 while SearchCount > 0 do
 begin
   if frWholeWord in Options then begin
     if not FindNextWordStart(Result) then Break;
   end;
   I := 0;
   while (CharMap[Result[I]] = SearchString[I+1]) do begin
     Inc(I);
     if I >= Length(SearchString) then
     begin
       if (not (frWholeWord in Options)) or (SearchCount = 0) or (Result[I] in WordDelimiters) then
         Exit;
       Break;
     end;
   end;
   Inc(Result, Direction);
   Dec(SearchCount);
 end;
 Result := nil;
end;

function SearchMemo(Memo: TCustomEdit; const SearchString: AnsiString; Options: TFindOptions): Boolean;
var Buffer, P: PAnsiChar;
   Size: Word;
begin
 Result := False;
 if Length(SearchString) = 0 then Exit;
 Size := Memo.GetTextLen;
 if Size = 0 then Exit;
 Buffer := StrAlloc(Size + 1);
 try
   Memo.GetTextBuf(Buffer, Size + 1);
   P := SearchBuf(Buffer, Size + 1, Memo.SelStart, Memo.SelLength, SearchString, Options);
   if P <> nil then
   begin
     Memo.SelStart := P - Buffer;
     Memo.SelLength := Length(SearchString);
     Result := True;
   end;
 finally
   StrDispose(Buffer);
 end;
end;


 
Омлет ©   (2011-10-30 11:32) [3]

> samsung   (30.10.11 00:54)
> find:=Edit4.Text; // Записываем в find текст из Edit
> For i:=0 to Memo.Lines.Count-1 do // Запускаем цикл поиска
> строки
>   If Pos(FIND, Memo.Lines.Text)<>0 Then
>     bComPort1.WriteStr(Edit5.Text + #13);
>     sleep(1000);
>   end;


Memo.Lines.Text возвращает текст всех строк. Достаточно написать:

if Pos(Edit4.Text, Memo.Text) > 0 then
begin
 bComPort1.WriteStr(Edit5.Text + #13);
 sleep(1000);
end;


без цикла.


 
Омлет ©   (2011-10-30 11:34) [4]

И, кстати, перевод строки в Windows - это не #13, а #13#10 (константа sLineBreak).


 
Virgo_Style ©   (2011-10-30 14:39) [5]


> Достаточно написать


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


 
Омлет ©   (2011-10-30 17:43) [6]

> Virgo_Style ©   (30.10.11 14:39) [5]
> Если исходить из того, что автор пишет русскими буквами - то так делать не надо.


Для D6 без разницы.


 
Virgo_Style ©   (2011-10-31 09:01) [7]


> Для D6 без разницы.


Едва ли pos в D6 умеет отличать вхождение подстроки от появления подстроки в зависимости от того, что написано на форуме.


 
Омлет ©   (2011-10-31 09:03) [8]

> Virgo_Style ©   (31.10.11 09:01) [7]

И какая связь с русскими буквами? Я не понял.


 
Virgo_Style ©   (2011-10-31 20:37) [9]

Постановка задачи описана по-русски, русскими соответственно буквами. Программа - на Pascal/Delphi, английскими.


 
Омлет ©   (2011-10-31 21:14) [10]

Евгений, для меня это слишком сложный юмор )



Страницы: 1 вся ветка

Текущий архив: 2012.02.05;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.008 c
2-1319724771
Очень Злой
2011-10-27 18:12
2012.02.05
property default и поля


2-1319653394
Дмитрий
2011-10-26 22:23
2012.02.05
Проблемы c Firebird


15-1318405047
boriskb
2011-10-12 11:37
2012.02.05
Работа


15-1318530903
AlexDn
2011-10-13 22:35
2012.02.05
Wifi


15-1318947354
И. Павел
2011-10-18 18:15
2012.02.05
Работа с БД в C#