Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/31: Рейтинг темы: голосов - 31, средняя оценка - 4.71
1 / 3 / 0
Регистрация: 25.04.2015
Сообщений: 472

Неправильно работает FindDialog

04.04.2019, 12:34. Показов 7937. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Пробую в качестве поиска использовать FindDialog. Пример со скринами в приложении. Похоже что он ищет всё что угодно, только не заданное слово, да ещё и подсвечивает непонятно как.
Вложения
Тип файла: rar Memo_FindDialog.rar (2.81 Мб, 51 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.04.2019, 12:34
Ответы с готовыми решениями:

Проверьте задачку по циклам, неправильно работает. [думаю что неправильно]
Спасибо что решили зайти. Задание выгладит так: http://*******/PW95p А результат выплнения: http://*******/KwhuS #include...

Неправильно работает цикл for, и функции работают неправильно
1) Неправильно работает цикл for(k=0...). Входит только 1 раз, дальше вылетает. Делал пошаговую отладку на проверку значения k. Выдаёт...

Цикл работает неправильно, в то время как POST работает
Всем привет! Я хотел написать под php скрипт с авторизацией, брут, на своем сайте(подбор пароля). Написал код на загрузку словаря +...

30
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33417 / 21525 / 8238
Регистрация: 22.10.2011
Сообщений: 36,932
Записей в блоге: 12
04.04.2019, 12:44
Нормально все ищется. Не надо все время забывать про кодировку. Еще раз: в Лазарусе ВСЕГДА используется UTF8, вот и переписываем код:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
procedure TfMemo.FindDialogFind(Sender: TObject);
 
  function UTF8RPosEx(const Substr, Source: string; Offset : Integer): PtrInt;
  var
    pRev: PtrInt;
  begin
    pRev := RPosEx(Substr, Source, Offset);    // Scan from the end.
    Result := UTF8Length(PChar(Source), pRev); // Length of the leading part.
  end;
 
 
var
   Found, StartPos: Integer;
   ToFind, Where : string;
 
   isReverse : Boolean;
begin
   ToFind := FindDialog.FindText;
   Where := Memo.Text;
   if not (frMatchCase in FindDialog.Options) then
   begin
      ToFind := AnsiUpperCase(ToFind);
      Where := AnsiUpperCase(Where);
   end;
 
   isReverse := not (frDown in FindDialog.Options);
 
   if Memo.SelLength <> 0 then
   begin
      StartPos := Memo.SelStart;
      if not isReverse then
         StartPos := StartPos + Memo.SelLength
   end
   else
   begin
      if isReverse then
         StartPos := Length(Where)
      else
         StartPos := 0;
   end;
 
 
   if isReverse then
      Found := UTF8RPosEx(ToFind, Where, StartPos)
   else
      Found := UTF8Pos(ToFind, Where, StartPos + 1);
 
   if Found <> 0 then
   begin
      Memo.HideSelection := False;
      Memo.SelStart := Found - 1;
      Memo.SelLength := UTF8Length(FindDialog.FindText);
   end
   else
      MessageDlg ('Строка ' + FindDialog.FindText + ' не найдена!', mtConfirmation, [mbYes], 0);
end;
Чудо!!! Все вдруг прекрасно работает. И поиск вперед, и поиск назад...
1
1 / 3 / 0
Регистрация: 25.04.2015
Сообщений: 472
06.04.2019, 10:06  [ТС]
Volvo! Как обычно спасибо. Подскажи, а как вызвать русифицированный диалог. При клике на компонент он вызывается, а после компиляции почему-то нет.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33417 / 21525 / 8238
Регистрация: 22.10.2011
Сообщений: 36,932
Записей в блоге: 12
06.04.2019, 14:52
Лучший ответ Сообщение было отмечено GAZot как решение

Решение

Цитата Сообщение от GAZot Посмотреть сообщение
а как вызвать русифицированный диалог
Под Windows - вот так:
Проект - Просмотреть исходный код проекта, откроется lpr-файл, который надо подкорректировать:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
program project1;
 
{$mode objfpc}{$H+}
 
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Translations, // <--- Добавляем в uses вот этот модуль !!!
  Forms, Unit1
  { you can add units after this };
 
{$R *.res}
 
begin
  // добавляем следующую строку:
  Translations.TranslateUnitResourceStrings('lclstrconsts', 'C:\lazarus\lcl\languages\lclstrconsts.ru.po'); // тут должен быть путь к установленному на машине Лазарусу
  RequireDerivedFormResource:=True;
  Application.Scaled:=True;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Если не хочется привязываться к конкретному пути - то можно этот файл скопировать в папку со своим проектом и убрать полный путь, оставив только имя файла...
0
1 / 3 / 0
Регистрация: 25.04.2015
Сообщений: 472
10.04.2019, 06:04  [ТС]
Volvo! А как приведённый выше код переделать под ReplaceDialog?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33417 / 21525 / 8238
Регистрация: 22.10.2011
Сообщений: 36,932
Записей в блоге: 12
10.04.2019, 11:09
Лучший ответ Сообщение было отмечено GAZot как решение

Решение

А чего там переделывать? OnFind переносится дословно так же, только название компонента надо заменить на соответствующие. А что касается OnReplace - я бы сделал как-то вот так:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm1.ReplaceDialog1Replace(Sender: TObject);
begin
  if frReplaceAll in ReplaceDialog1.Options then // заменить все вхождения
  begin
     Memo1.Text := UTF8StringReplace(Memo1.Text, ReplaceDialog1.FindText, ReplaceDialog1.ReplaceText, [rfReplaceAll]);
  end
  else
  begin // заменять по одному
    ReplaceDialog1Find(Self); // находим то, что записано в поле FindText
 
    // и если что-то было найдено (длина выделенного текста больше 0) - то
    // заменяем выделенный текст на содержимое второго поля. Вот и все...
    if Memo1.SelLength > 0 then Memo1.SelText := ReplaceDialog1.ReplaceText;
  end;
end;
1
1 / 3 / 0
Регистрация: 25.04.2015
Сообщений: 472
10.04.2019, 12:35  [ТС]
ReplaceDialog1Find(Self); ??? может ReplaceDialog1(Self);

Добавлено через 1 минуту
хотя и так ругается
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33417 / 21525 / 8238
Регистрация: 22.10.2011
Сообщений: 36,932
Записей в блоге: 12
10.04.2019, 12:47
Цитата Сообщение от GAZot Посмотреть сообщение
ReplaceDialog1Find(Self);
(ну или как там у тебя ReplaceDialog1 на форме называется, я не телепат же...) , только для этого надо реализовать обработчик OnFind для ReplaceDialog-а, чего ты, по всей видимости, не сделал. Поэтому и ругается.
0
1 / 3 / 0
Регистрация: 25.04.2015
Сообщений: 472
10.04.2019, 13:41  [ТС]
Да я реализовал, это для onReplace. OnFind вроде для FindDialog.

Добавлено через 1 минуту
И у Вас
Pascal
1
procedure TForm1.ReplaceDialog1Replace(Sender: TObject);
Добавлено через 45 минут
Volvo! Уточни пожалуйста приведённый тобой код всё таки не по onReplace, как у тебя, а по OnFind.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33417 / 21525 / 8238
Регистрация: 22.10.2011
Сообщений: 36,932
Записей в блоге: 12
10.04.2019, 14:37
Ты читать когда-нибудь начнешь? Я ж написал:
Цитата Сообщение от volvo Посмотреть сообщение
OnFind переносится дословно так же, только название компонента надо заменить на соответствующие
Что, обязательно на каждый чих переписывать сюда весь код? Ну, если это поможет - то вот так:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
procedure TForm1.ReplaceDialog1Find(Sender: TObject);
function UTF8RPosEx(const Substr, Source: string; Offset : Integer): PtrInt;
var
  pRev: PtrInt;
begin
  pRev := RPosEx(Substr, Source, Offset);    // Scan from the end.
  Result := UTF8Length(PChar(Source), pRev); // Length of the leading part.
end;
 
 
var
 Found, StartPos: Integer;
 ToFind, Where : string;
 
 isReverse : Boolean;
begin
 ToFind := ReplaceDialog1.FindText;
 Where := Memo1.Text;
 if not (frMatchCase in ReplaceDialog1.Options) then
 begin
    ToFind := AnsiUpperCase(ToFind);
    Where := AnsiUpperCase(Where);
 end;
 
 isReverse := not (frDown in ReplaceDialog1.Options);
 
 if Memo1.SelLength <> 0 then
 begin
    StartPos := Memo1.SelStart;
    if not isReverse then
       StartPos := StartPos + Memo1.SelLength
 end
 else
 begin
    if isReverse then
       StartPos := Length(Where)
    else
       StartPos := 0;
 end;
 
 
 if isReverse then
    Found := UTF8RPosEx(ToFind, Where, StartPos)
 else
    Found := UTF8Pos(ToFind, Where, StartPos + 1);
 
 if Found <> 0 then
 begin
    Memo1.HideSelection := False;
    Memo1.SelStart := Found - 1;
    Memo1.SelLength := UTF8Length(ReplaceDialog1.FindText);
 end
 else
    MessageDlg ('Строка ' + ReplaceDialog1.FindText + ' не найдена!', mtConfirmation, [mbYes], 0);
end;
 
procedure TForm1.ReplaceDialog1Replace(Sender: TObject);
begin
  if frReplaceAll in ReplaceDialog1.Options then
  begin
     Memo1.Text := UTF8StringReplace(Memo1.Text, ReplaceDialog1.FindText, ReplaceDialog1.ReplaceText, [rfReplaceAll]);
  end
  else
  begin
    ReplaceDialog1Find(Self);
    if Memo1.SelLength > 0 then Memo1.SelText := ReplaceDialog1.ReplaceText;
  end;
end;
Если хочешь нормально работать с ReplaceDialog-ом - то обязан реализовывать и OnFind и OnReplace для него. И не важно, что OnFind для FindDialog-а уже был реализован. Кнопку"Найти далее" ты ж нажимаешь именно в ReplaceDialog-е...
0
1 / 3 / 0
Регистрация: 25.04.2015
Сообщений: 472
10.04.2019, 15:24  [ТС]
Volvo! Раз уж ...OnFind переносится дословно так же, только название компонента надо заменить на соответствующие..., то можно ли придумать что нибудь универсально, что бы одинаковый код не писать если эти два компонента вместе используются
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33417 / 21525 / 8238
Регистрация: 22.10.2011
Сообщений: 36,932
Записей в блоге: 12
10.04.2019, 15:40
Легко:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// глобальная функция
procedure DoFindText(ADialog : TFindDialog; AControl : TMemo);
function UTF8RPosEx(const Substr, Source: string; Offset : Integer): PtrInt;
var
  pRev: PtrInt;
begin
  pRev := RPosEx(Substr, Source, Offset);    // Scan from the end.
  Result := UTF8Length(PChar(Source), pRev); // Length of the leading part.
end;
 
var
 Found, StartPos: Integer;
 ToFind, Where : string;
 
 isReverse : Boolean;
begin
 ToFind := ADialog.FindText;
 Where := AControl.Text;
 if not (frMatchCase in ADialog.Options) then
 begin
    ToFind := AnsiUpperCase(ToFind);
    Where := AnsiUpperCase(Where);
 end;
 
 isReverse := not (frDown in ADialog.Options);
 
 if AControl.SelLength <> 0 then
 begin
    StartPos := AControl.SelStart;
    if not isReverse then
       StartPos := StartPos + AControl.SelLength
 end
 else
 begin
    if isReverse then
       StartPos := Length(Where)
    else
       StartPos := 0;
 end;
 
 
 if isReverse then
    Found := UTF8RPosEx(ToFind, Where, StartPos)
 else
    Found := UTF8Pos(ToFind, Where, StartPos + 1);
 
 if Found <> 0 then
 begin
    AControl.HideSelection := False;
    AControl.SelStart := Found - 1;
    AControl.SelLength := UTF8Length(ADialog.FindText);
 end
 else
    MessageDlg ('Строка ' + ADialog.FindText + ' не найдена!', mtConfirmation, [mbYes], 0);
end;
 
// тогда OnFind для диалогов как поиска, так и замены будет выглядеть вот так:
 
procedure TForm1.FindDialog1Find(Sender: TObject);
begin
  DoFindText(Sender as TFindDialog, Memo1);
end; 
 
procedure TForm1.ReplaceDialog1Find(Sender: TObject);
begin
  DoFindText(Sender as TFindDialog, Memo1);
end;
, так лучше?
0
1 / 3 / 0
Регистрация: 25.04.2015
Сообщений: 472
10.04.2019, 15:48  [ТС]
Конечно лучше. У тебя прям ответы заготовлены что ли. Только что с этими делать:
Pascal
1
FindDialog.Execute(); и  ReplaceDialog.Execute();
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33417 / 21525 / 8238
Регистрация: 22.10.2011
Сообщений: 36,932
Записей в блоге: 12
10.04.2019, 15:50
А это два разных действия, придется делать либо одно либо другое, это не меняется.

Цитата Сообщение от GAZot Посмотреть сообщение
У тебя прям ответы заготовлены что ли.
Разумеется Я уже сейчас знаю, какой будет твой следующий вопрос, и уже приготовил ответ для него
0
1 / 3 / 0
Регистрация: 25.04.2015
Сообщений: 472
12.04.2019, 17:25  [ТС]
Что то не работает у меня второй вариант с глобальной функцией
Вложения
Тип файла: rar Memo_Find_ReplaceDialog.rar (2.71 Мб, 15 просмотров)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33417 / 21525 / 8238
Регистрация: 22.10.2011
Сообщений: 36,932
Записей в блоге: 12
12.04.2019, 17:40
Что именно "не работает"? Поиск через TFindDialog работает прекрасно, через TReplaceDialog - тоже. А то, что не меняет - так OnReplace не реализовано, вот и не меняет.
Миниатюры
Неправильно работает FindDialog  
0
1 / 3 / 0
Регистрация: 25.04.2015
Сообщений: 472
12.04.2019, 20:26  [ТС]
Да поиск работает. Только я думал в функции будет реализована и замена по:
Pascal
1
2
3
4
procedure TfMemo.ReplaceDialogReplace(Sender: TObject);
begin
  ...
end;
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33417 / 21525 / 8238
Регистрация: 22.10.2011
Сообщений: 36,932
Записей в блоге: 12
12.04.2019, 21:02
Я устал с тобой спорить. Для того, чтобы была замена, нужно (Внезапно!!! Никто не подозревал, правда?) РЕАЛИЗОВАТЬ OnReplace. Интересно, с чего бы это?

А реализация замены написана выше. Из воздуха она не возьмется. Функция работает с классом TFindDialog, если ты не заметил, который про замену вообще НИЧЕГО не знает. Как ты хочешь, чтобы она еще что-то и меняла?
0
1 / 3 / 0
Регистрация: 25.04.2015
Сообщений: 472
12.04.2019, 21:36  [ТС]
ToFind := ReplaceDialog1.FindText; и ToFind := ADialog.FindText; можно ли в функции проверять какой компонент выбран, дальше код практически один и тот же.
0
75 / 66 / 12
Регистрация: 09.02.2016
Сообщений: 913
Записей в блоге: 16
26.05.2020, 09:18
почему то у меня код нормально работает при поиске вперед, но при поиске назад пропускает 2-3 вхождения строки...

в каталоге с проектом лежат файлы isr.asm на которых можно проверить работу, я ищу строку " .word " (без пробелов)
хорошо видно что вверх (назад) поиск идет через несколько вхождений

что не так ?
Вложения
Тип файла: zip EDAS.zip (548.7 Кб, 8 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.05.2020, 09:18
Помогаю со студенческими работами здесь

Поиск нужной строки в ComboBox с помощью компонента FindDialog
Нужно организовать поиск нужной строки в ComboBox с помощью компонента FindDialog.

findDialog
Вообщем проблема такова, при компиляции вылезают ошибки /home/gorans/QT profects/FindDialog/main.cpp:2: In file included from...

FindDialog и ReplaceDialog
вот как делал не пашет никак. вообще. ReplaceDialog1-&gt;FindText = Memo1-&gt;SelText; ReplaceDialog1-&gt;Execute();

FindDialog в браузере
Я пишу книгу электронную. Имеются TOutline TWebBrowser Мне надо поиск По Html страничке через кнопку Find Dialog Не знаю как реализовать...

FindDialog и ReplaceDialog
Как с помощью FindDialog искать текст,например с учетом регистра.Или Вверх? Для поиска такой код:procedure TForm1.FindDialog1Find(Sender:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru