Форум: "Начинающим";
Текущий архив: 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