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

Вниз

Поиск и замена   Найти похожие ветки 

 
AlexanderMS ©   (2006-05-06 18:50) [0]

Подскажите, пожалуйста: как организовать поиск фрагмента по массиву так, чтобы при поиске можно было использовать "Найти далее", "Только слово целиком" и т.п. Массив типа Record: название элемента и значение (оба string). При выборе строки названия из ListBox справа в Edit отображается редактируемое название, а под ним, в Memo, - значение. Поиск должен идти и в названии, и в значении (везде). Задача довольно сложная, может, в Delphi предусмотрены для этого функции? Заранее спасибо.


 
Лшдлуттнсфе   (2006-05-06 19:01) [1]

Задача несложная.

определяем, не поиск ли это далее.
если нет, начинаем с первой записи, если да - с сохраненного номера записи.
проверяем, не вышли ли мы за границы количества записей, если вышли - то поиск завершен.
сравниваем.
если нашли, то сохраняем номер записи, выводим результат, если не нашли - переходим на следующую запись.


 
AlexanderMS ©   (2006-05-06 19:11) [2]


> Задача несложная.

Теперь согласен. Но как выделить искомый фрагмент, найдя его в тексте?


 
Джо ©   (2006-05-06 19:12) [3]

> [2] AlexanderMS ©   (06.05.06 19:11)
>
> > Задача несложная.
>
> Теперь согласен. Но как выделить искомый фрагмент, найдя
> его в тексте?

Выделить элемент в ListBox"е — свойство ItemIndex.


 
ЛшдлуттнСфе   (2006-05-06 19:13) [4]


> выделить искомый фрагмент, найдя его в тексте


SelStart, SelLength


 
Kilkennycat ©   (2006-05-06 19:16) [5]

Да, совсем вылетело из памяти: можно воспользоваться TFindDialog,  вот пример из справки Делфи:

his example requires a TRichEdit, a TButton, and a TFindDialog.
Clicking the button click will display a Find Dialog to the right of the edit control.  Filling in the "Find what" text and pressing the Find Next button will select the first matching string in the Rich Edit control that follows the previous selection.

procedure TForm1.Button1Click(Sender: TObject);

begin
 FindDialog1.Position := Point(RichEdit1.Left + RichEdit1.Width, RichEdit1.Top);
 FindDialog1.Execute;
end;

procedure TForm1.FindDialog1Find(Sender: TObject);
var
 FoundAt: LongInt;
 StartPos, ToEnd: Integer;
begin
 with RichEdit1 do
 begin
   { begin the search after the current selection if there is one }
   { otherwise, begin at the start of the text }
   if SelLength <> 0 then

     StartPos := SelStart + SelLength
   else

     StartPos := 0;

   { ToEnd is the length from StartPos to the end of the text in the rich edit control }

   ToEnd := Length(Text) - StartPos;

   FoundAt := FindText(FindDialog1.FindText, StartPos, ToEnd, [stMatchCase]);
   if FoundAt <> -1 then
   begin
     SetFocus;
     SelStart := FoundAt;
     SelLength := Length(FindDialog1.FindText);
   end;
 end;
end;


 
AlexanderMS ©   (2006-05-06 19:17) [6]


> Выделить элемент в ListBox"е — свойство ItemIndex.

Это я знаю. У меня поиск фрагмента. Допустим, строка "Hello". При поиске "el" этот фрагмент должен быть выделен (не в ListBox, не получится) справа, в Edit (см. [1]).


 
KilkennyCat ©   (2006-05-06 19:17) [7]

FoundAt := FindText(FindDialog1.FindText, StartPos, ToEnd, [stMatchCase]);

Вот эта строчка Вам будет наиболее интересна.


 
KilkennyCat ©   (2006-05-06 19:19) [8]


> (не в ListBox, не получится)


И в нем тоже можно.


 
Джо ©   (2006-05-06 19:23) [9]

> [6] AlexanderMS ©   (06.05.06 19:17)

Тогда см. [4]. Впрочем, в ListBox тоже можно.


 
AlexanderMS ©   (2006-05-06 19:34) [10]


> Впрочем, в ListBox тоже можно.

Но мне не нужно. А насчёт FindDialog: у меня свой, со своими опциями.


> FoundAt := FindText(FindDialog1.FindText, StartPos, ToEnd,
>  [stMatchCase]);
>
> Вот эта строчка Вам будет наиболее интересна.


Спасибо за строчку.


> Kilkennycat ©   (06.05.06 19:16) [5]


Спасибо за код.
Благодарю за помощь, буду пробовать.


 
AlexanderMS ©   (2006-05-06 19:57) [11]

Ошибочка вышла:

[Error] FRGoTo.pas(140): Undeclared identifier: "FindText".


 
AlexanderMS ©   (2006-05-06 20:00) [12]

AlexanderMS ©   (06.05.06 19:57) [11]
Понял, у меня Memo, а не RichEdit.


 
Джо ©   (2006-05-06 20:00) [13]

> [11] AlexanderMS ©   (06.05.06 19:57)
> Ошибочка вышла:
>
> [Error] FRGoTo.pas(140): Undeclared identifier: "FindText".

Это метод TRichEdit.


 
ЛшдлуттнСфе   (2006-05-06 20:28) [14]

это моя ошибка...


 
ЛшдлуттнСфе   (2006-05-06 20:39) [15]

Вот, нашел в делфиворде (не проверял)

procedure TForm1.FindDialog1Find(Sender: TObject);
var
 Buff, P, FT: PChar;
 BuffLen: Word;
begin
 with Sender as TFindDialog do
 begin
   GetMem(FT, Length(FindText) + 1);
   StrPCopy(FT, FindText);
   BuffLen := Memo1.GetTextLen + 1;
   GetMem(Buff, BuffLen);
   Memo1.GetTextBuf(Buff, BuffLen);
   P := Buff + Memo1.SelStart + Memo1.SelLength;
   P := StrPos(P, FT);
   if P = nil then
     MessageBeep(0)
   else
   begin
     Memo1.SelStart := P - Buff;
     Memo1.SelLength := Length(FindText);
   end;
   FreeMem(FT, Length(FindText) + 1);
   FreeMem(Buff, BuffLen);
 end;
end;

procedure TForm1.ReplaceDialog1Replace(Sender: TObject);
begin
 with Sender as TReplaceDialog do
   while True do
   begin
     if Memo1.SelText <> FindText then
       FindDialog1Find(Sender);
     if Memo1.SelLength = 0 then
       Break;
     Memo1.SelText := ReplaceText;
     if not (frReplaceAll in Options) then
       Break;
   end;
end;



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

Форум: "Начинающим";
Текущий архив: 2006.05.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.012 c
4-1140732100
Sysanin
2006-02-24 01:01
2006.05.21
Загруженость ситемы


2-1146234817
AlexanderMS
2006-04-28 18:33
2006.05.21
Удаление нескольких выбранных элементов в ListBox


15-1146117235
syte_ser78
2006-04-27 09:53
2006.05.21
проблемы с модемом


15-1145707662
ZeFiR
2006-04-22 16:07
2006.05.21
JS трабла.


2-1146036331
valdemot
2006-04-26 11:25
2006.05.21
компилятор





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский