Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.02.05;
Скачать: [xml.tar.bz2];

Вниз

Поиск в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.003 c
2-1319364878
stas
2011-10-23 14:14
2012.02.05
DBGrid колонки справа налево


15-1318916274
Mamed
2011-10-18 09:37
2012.02.05
TQRPExpr+Unicode


11-1206198913
DJ_UZer
2008-03-22 18:15
2012.02.05
Горячие клавиши


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


15-1317533220
brother
2011-10-02 09:27
2012.02.05
Менеджер - экономическая игра





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский