![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск в Memo [D6, XP]
samsung © (2011-10-30 00:54:00)Всем здраствуйте!!!
Не пойму как сделать поиск в 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-31 21:14:00) [1]Евгений, для меня это слишком сложный юмор )
Virgo_Style (2011-10-31 20:37:00) [2]Постановка задачи описана по-русски, русскими соответственно буквами. Программа - на Pascal/Delphi, английскими.
Омлет (2011-10-31 09:03:00) [3]> Virgo_Style © (31.10.11 09:01) [7]
И какая связь с русскими буквами? Я не понял.
Virgo_Style (2011-10-31 09:01:00) [4]
> Для D6 без разницы.
Едва ли pos в D6 умеет отличать вхождениеподстроки от появленияподстроки в зависимости от того, что написано на форуме.
Омлет (2011-10-30 17:43:00) [5]> Virgo_Style © (30.10.11 14:39) [5]
> Если исходить из того, что автор пишет русскими буквами - то так делать не надо.
Для D6 без разницы.
Virgo_Style (2011-10-30 14:39:00) [6]
> Достаточно написать
Если исходить из того, что автор пишет русскими буквами - то так делать не надо. Если из того, что английскими - тогда да. Но с английскими тут, кажется, напряг.
Омлет (2011-10-30 11:34:00) [7]И, кстати, перевод строки в Windows - это не #13, а #13#10(константа sLineBreak).
Омлет (2011-10-30 11:32:00) [8]> 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:20:00) [9]Что-то ком-порты нынче в тренде..
> 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 01:13:00) [10]
> For i:=0 to Memo.Lines.Count-1 do // Запускаем цикл поиска
> строки
> If Pos(FIND, Memo.Lines.Text)<>0
Что за бред?