(решено) ActionList SearchFind. Названия элементов узнать?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

(решено) ActionList SearchFind. Названия элементов узнать?

Сообщение vitaly_l »

Всем хорошего настроения!

В ActionList, заложен Search в нём есть SearchFind.
Названия элементов на Search форме - как узнать, чтобы получить к ним доступ ?
Имеются ввиду Label, т.к. остальное выведено в панель.
Последний раз редактировалось vitaly_l 28.08.2015 13:26:24, всего редактировалось 1 раз.
ENERGIX
новенький
Сообщения: 18
Зарегистрирован: 01.03.2012 20:35:40

Сообщение ENERGIX »

Какой доступ? А почему именно через поиск, а не напрямую связать, через ComboВox? Число элементов неизменно и они на основной форме или конструктор?
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

Вы наверно ложно интерпретировали. В ActionList - заложена системная форма для "поиска". Я хочу её использовать, а не делать свою.
Доступ к функциям и названию формы я нашёл, т.к. они в панели. А вот к остальным элементам "кнопки и label-ы", не получается :oops: :cry:
Хочу поменять там Caption, а то всё на English.
ENERGIX
новенький
Сообщения: 18
Зарегистрирован: 01.03.2012 20:35:40

Сообщение ENERGIX »

Извини друг, явно не понял. У меня в CT5.2 у ActionList нет вызова SearchFind(может плохо искал). По опыту скажу, пришлось как то переписывать форму поиска RxDBGrid - через редактор кода, нажимаете CTRL+ лвк мыши по вызову формы и правите юнит формы
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

Спасибо в любом случае. Ctrl + лвк изначально пробовал. Там это не работает, оно как-то хитро встроено в систему. Теперь в ActionList - есть стандартные диалоги: Open, Save, Find и т.д. <= их даже ненужно класть на форму. Только выбрать в ActionList и дальше обращаться к ним. Я вчера только нашёл (раньше этого не было). Мне понравилось нововведение, я думал может кто уже знает как ими управлять? Точнее, как переименовать кнопки и остальное.
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

:)
подключаете StdActns и динамически создаете ваше "чудо". А потом пользуете.
п.с.
это диво-дивное давно в лазаре "сидит"...
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

pupsik писал(а):StdActns

Да это оно!
Он(StdActns) у меня уже был подключен и там действительно все диалоги прописаны в коде. И даже готовый поиск, есть.
А вот:
pupsik писал(а):динамически создаете ваше "чудо"

я не понимаю... что конкретно я должен сделать?

Все диалоги я подключаю в ActionList, методом двойного клика и потом они и их функции становятся доступны в панели.
А вот как получить доступ к Caption кнопок и Label - не понимаю... Спасите помогите <== :oops: :cry:

Добавлено спустя 5 минут 6 секунд:
Re: В ActionList SearchFind. Названия элементов на форме узнать?
А понял... Нужно сделать, например: someFind := TFindDialog.Create... <== это будет динамически создать "чудо"...
Хорошо, допустим сделал...

А вот как получить доступ к Caption кнопок и Label - всё равно не понимаю... Спасите помогите <== :oops: :cry:

.
ENERGIX
новенький
Сообщения: 18
Зарегистрирован: 01.03.2012 20:35:40

Сообщение ENERGIX »

Интересно то, что FileOpenDialog и без динамически.. работает, а вот SearchFind нет?
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

ENERGIX писал(а):SearchFind

Всё работает, ничего не сломано(хотя возможно это и баг, т.к. OpenFile - сам переводится на Русский, а Search нет).

Я просто не могу получить доступ к элементам на форме поиска, который в ActionList (StdActns).
Там все надписи на английском, а я хочу их поменять на Русские.
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

Поискал решение, но похоже халявы не предусмотрено - диалог только для чтения:

Код: Выделить всё

TSearchFind = class(TSearchAction)
....
    property Dialog: TFindDialog read GetFindDialog;

Так что придется создавать свой опять из того же, что используется в TSearchFind стандартного диалога TFindDialog. Далее об этом.

У TFindDialog вижу защищенное (т.е. доступное потомкам) свойство - искомую форму

Код: Выделить всё

 FFindForm: TForm;

им и воспользуюсь, перекрыв один из методов.

Код: Выделить всё

  TMyFindDialog = class(TFindDialog)
    public
      function Execute: Boolean; override;
  end;


Код: Выделить всё

function TMyFindDialog.Execute: Boolean;
  begin
    inherited;
    (FFindForm.FindComponent('FindButton') as TButton).Caption := 'Поиск'; // и т.д.
  end;


Естественно создать где-то диалог до использования

Код: Выделить всё

procedure TForm1.FormCreate(Sender: TObject);
begin
  MyFindDialog := TMyFindDialog.Create(Self);
end;


Там уже можете в своем экшн листе создать действие-пустышку (и даже назвать его СерчФайнд) и привязать диалог к этому действию

Код: Выделить всё

procedure TForm1.Action1Execute(Sender: TObject);
begin
  MyFindDialog.Execute;
end;
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

resident писал(а):Поискал решение, но похоже халявы не предусмотрено

Круто, подробно и понятно. Спасибо ГРОМАДНОЕ!

:?: Вот только как Вы узнали имя кнопки => "FindButton" ??? Где имена элементов хранятся? :oops: :cry:

.
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

vitaly_l писал(а):Спасибо ГРОМАДНОЕ!

С вас голос за мою инициативу :)
Чтобы голосовать, нужно быть зарегистрированным на госуслугах, но думаю, что в наше время уже все должны быть зарегистрированы. Тем более сейчас вроде упрощенная регистрация по сотовому.
https://www.roi.ru/22005

Вот только как Вы узнали имя кнопки => "FindButton" ??? Где имена элементов хранятся?

За четыре прыжка:
Все что здесь написано я узнал одним способом - щелкаю правой кнопкой мыши по какому-нить названию и выбираю "Найти объявление", так копаюсь в исходниках. В итоге прошел путь TSearchFind >>> TFindDialog >>> тут показалась подозрительной функция

Код: Выделить всё

 function CreateForm:TForm;virtual;

Ищу её реализацию в файле внизу (или, поставив курсор на неё, тупо жму комбинацию кнопок Контрол+Шифт+Стрелка вниз):

Код: Выделить всё

function TFindDialog.CreateForm: TForm;
begin
  // do not use Self as Owner, otherwise as desgntime this will not work
  Result := TFindDialogForm.Create(nil);
  with TFindDialogForm(Result) do
  begin
    FindButton.Caption := rsFind;
    CancelButton.Caption := rsMbCancel;
    HelpButton.Caption := ifsVK_HELP;
    WholeWordsOnlyCheckBox.Caption := rsWholeWordsOnly;
    CaseSensitiveCheckBox.Caption := rsCaseSensitive;
    EntireScopeCheckBox.Caption := rsEntireScope;
    FindLabel.Caption := rsText;
    DirectionRadioGroup.Caption := rsDirection;
    DirectionRadioGroup.Items[0] := rsForward;
    DirectionRadioGroup.Items[1] := rsBackward;
    //Setting up button eventhandlers
    FindButton.OnClick := @FindClick;
    HelpButton.OnClick := @HelpClick;
    CancelButton.OnClick := @CancelClick;
    PopupMode := pmAuto;
  end;
end; 


Можно конечно проверить, может чего забыли. Добавлю в перекрытые метод пару строк:

Код: Выделить всё

function TMyFindDialog.Execute: Boolean;
  var i: integer;
  begin
    inherited;
    (FFindForm.FindComponent('FindButton') as TButton).Caption := 'Поиск';

    for i := 0 to pred(FFindForm.ComponentCount) do
      Form1.mm.Lines.Add(FFindForm.Components[i].Name + ' - ' + FFindForm.Components[i].ClassName);
  end;

В итоге в mm (это я так называю TMemo) список контролов:
FindLabel - TLabel
EditFind - TEdit
FindButton - TButton
CancelButton - TButton
WholeWordsOnlyCheckBox - TCheckBox
CaseSensitiveCheckBox - TCheckBox
DirectionRadioGroup - TRadioGroup
HelpButton - TButton
EntireScopeCheckBox - TCheckBox
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

Да! Суперски - это то что нужно! И даже больше чем нужно!
ВАУ - ГРОМАДНЫЙ РЕСПЕКТ И УВАЖУХА!
(УВАЖУХА - это Уральский термин, у меня так брат НАИВЫСШУЮ оценку даёт)

PS: Голосуйте все на https://www.roi.ru/22005 - это сайт Российской общественной инициативы, пусть там отменят все лимиты, постольку поскольку для уважаемого resident - это нужно и важно.
Последний раз редактировалось vitaly_l 28.08.2015 14:03:20, всего редактировалось 1 раз.
Ответить