Как расширить список параметров метода (т.е. OnClick) и использовать его? - PullRequest
1 голос
/ 11 февраля 2010

Я разрабатываю приложение, в котором есть поля ввода, и всякий раз, когда пользователь входит в элемент управления, с помощью кнопок создается дополнительная панель.

Кнопки имеют подписи, представляющие специальные символы, такие как градусы, греческие символы.

При нажатии кнопки соответствующий специальный символ должен быть добавлен в поля ввода TEdit существующий текст.

В форме много полей ввода. Таким образом, при каждом событии OnEnter TEdit он генерирует специальный символ выбора панель, а событие OnExit освобождает панель.

Я хочу как-то сказать кнопке, к которой TEdit он должен добавить символ, когда он нажимается.

procedure TForm1.SpecSimboliai(Parent: TWinControl; Edit: TEdit);
var
    pSpec: TPanel;
    oClose: TPanelEx;
    sTekstas: TLabel;
    oButton: TPanelEx;
begin
    pSpec := TPanel.Create(Self);
    pSpec.Parent := Parent;
    pSpec.Align := alBottom;
    pSpec.Height := 38;
    pSpec.Name := 'spec';
    pSpec.Caption := '';
    pSpec.ParentBackground := false;

    sTekstas := TLabel.Create(Self);
    sTekstas.Parent := pSpec;
    sTekstas.Left := 10;
    sTekstas.Top := 12;
    sTekstas.Caption := 'Specialūs simboliai:';

    oClose := TPanelEx.Create(Self);
    oClose.Parent := pSpec;
    ...
    oClose.Top := 2;
    oClose.Anchors := [akTop,akRight];
    oClose.OnClick := UzdarytiSpec;

    oButton := TPanelEx.Create(Self);
    oButton.Parent := pSpec;
    oButton.Width := 14;
    oButton.Height := 14;
    oButton.CenterText := true;
    oButton.Caption := #$00B0;
    oButton.OnClick := AddSpecSymbol;

    ... //several other buttons
end;

Эта процедура выполняется для события TEdit.OnEnter, которое выглядит как

..InputEnter(Sender: TObject);
begin
    SpecSimboliai(TEdit(Sender).Parent,TEdit(Sender));
end;

Таким образом, панель, метка, кнопка закрытия и кнопка со знаком степени созданы в приведенном выше коде.

Я хочу передать параметр Edit кнопке, чтобы он знал, с каким контроллером он работает, однако я понятия не имею, как это сделать, поскольку событие oButton.OnClick ожидает только один параметр, что Sender: TObject.

То, что я хотел бы себе представить, выглядит примерно так:

oButton.OnClick := AddSpecSymbol(Edit);

Так что это будет звучать так: oButton.OnClick(Sender: TObject) и AddSpecSymbol(Sender: TObject; Edit: TEdit) имеют одинаковый параметр Отправитель , который они используют при возникновении события, но параметр Edit является дополнительным, который назначается уже вручную и должен использоваться AddSpecSymbol .

хорошо, я надеюсь, что все, что я написал, можно понять, если нет, скажите мне, и я постараюсь отредактировать.

Спасибо

Ответы [ 3 ]

4 голосов
/ 11 февраля 2010

Один из возможных, но «грязных» методов - использовать свойство Tag для сохранения приведенного объекта кнопки в целое число

oButton := TPanelEx.Create(Self);
oButton.Parent := pSpec;
oButton.Width := 14;
oButton.Height := 14;
oButton.CenterText := true;
oButton.Caption := #$00B0;
oButton.Tag := Integer(Edit);
oButton.OnClick := AddSpecSymbol;

Когда вызывается AddSpecSymbol, приведите тег обратно к TEdit

var
  Edit : TEdit;
begin
  Edit := TEdit((Sender as TButton).Tag);
4 голосов
/ 11 февраля 2010

Вы можете ввести поле в форме, которая указывает текущий TEdit. Установите значение TEdit (Отправитель) при входе в поле и установите значение nil при выходе из поля Событие OnClick может затем использовать это поле для доступа к нужному TEdit.

1 голос
/ 11 февраля 2010

Другой вариант - создать новый тип TSpecialSymbolPanel = class (TCustomForm). Вы можете создать панель с кнопками и иметь обработку OnClick в этом типе. Поскольку это новый тип, он может иметь дополнительные свойства, одним из которых может быть связанный TEdit. Я считаю, что удаление этого кода из вашей основной формы будет считаться соответствующим рефакторингом.

Для этого добавьте новую форму в ваш проект. Сделайте размер как ваша панель и поместите все кнопки на него.

Затем вы можете добавить приватную переменную, например: FLinkedEdit: TEdit; и публичная собственность, такая как: свойство LinkedEdit TEdit читать FLinkedEdit писать FLinkedEdit; В OnClick для каждой кнопки сделайте что-то вроде: FLinkedEdit.Text: = FLinkedEdit.Text + 'специальный символ';

В основной форме добавьте этот новый блок в пункт о вашем использовании.

Затем добавьте приватную переменную: FSpecialSymbolPanel: TSpecialSymbolPanel;

В FormCreate инициализируйте панель примерно так:

FSpecialSymbolPanel: = TSpecialSymbolPanel.Create (Self); с FSpecialSymbolPanel сделать начать BorderIcons: = []; BorderStyle: = bsNone; Parent: =-родительский компонент-; Видимый: = Ложь; конец;

Затем в OnEnter ваших элементов управления редактирования вы можете сделать это:

с FSpecialSymbolPanel do начать Top: = TEdit (Отправитель) .Top; Слева: = TEdit (Отправитель) .Left + TEdit (Отправитель) .Width; Видимый: = Истина; LinkedEdit: = TEdit (Отправитель); конец

В OnExit просто скрыть панель: FSpecialSymbolPanel.Visible: = False;

Cheers, Tony

...