2013-10-07 1 views
0

XE3 Prof, Win64.Delphi, редактор для кнопки, сохранение значения по умолчанию в IDE

Я создал новый компонент Button, основанный на TButton.

У него есть специальное меню в IDE, называемое «Set Button Style».

procedure Register; 
begin 
    RegisterComponents('SComps', [TSAButton]); 
    RegisterComponentEditor(TSAButton, TSAButtonEditor); 
end; 

procedure TSAButtonEditor.ExecuteVerb(Index: Integer); 
begin 
    Set_Style(TSAButton(Component)); 
end; 

function TSAButtonEditor.GetVerb(Index: Integer): string; 
begin 
    Result := 'Set Button Style'; 
end; 

function TSAButtonEditor.GetVerbCount: Integer; 
begin 
    Result := 1; 
end; 

У кнопки есть специальный клик в IDE - двойной щелчок на компоненте генерирует OnClick в моем коде.

После того, как я установил меню редактора, эта возможность была потеряна, потому что IDE вызывает мою функцию, а не оригинал (генерирование кода по умолчанию).

Как восстановить эту возможность в моей кнопке с сохранением моего меню?

Спасибо за каждую информацию!

дд

+0

Конкретная версия Delphi должна быть в ваших тегах. Поскольку у вас уже есть 5 тегов, вам нужно удалить наименее релевантный, чтобы добавить 'delphi-xe3' –

+0

Я не понимаю, что это значит: * После того, как я установил меню редактора, эта возможность потеряна, потому что IDE вызывает мои функция, а не оригинал. * –

+0

Когда вы нажимаете на обычную кнопку, ваша среда IDE генерирует «onclick» для dfm/pas. После того, как я установил свой редактор, IDE вызывает мою функцию «Set Button Style». Таким образом, «onclick» генерирует потерянные для меня. – durumdara

ответ

0

Я предполагаю, что ваш редактор был унаследован от TComponentEditor? if Итак, вам нужно вызвать функцию редактирования по умолчанию, чтобы генерировать событие OnClick вашего компонента внутри вашего редактора ExecuteVerb. Примечание: функция редактирования пусто в классе TComponentEditor .. Так что вам нужно использовать интерфейс IDefaultEditor для вызова функции редактирования:

Первый метод:

procedure TYourEditor.ExecuteVerb(Index: Integer); 
var 
    DefEditor: IDefaultEditor; 
begin 
    DefEditor := TDefaultEditor.Create(Component, Designer); 
    DefEditor.Edit; 
    case Index of 
    0: 
     // DoSomething !! 
     // ... 
     // ... 
    end; 
     //... 
end; 

Второй метод:

У вас есть другой способ: вы можете наследовать своего редактора из класса TDefaultEditor (а не из TComponentEditor):

TYourEditor = class(TDefaultEditor) 
    ..... 
procedure TYourEditor.ExecuteVerb(Index: Integer); 
begin 
    inherited; 
end; 

Но если вы используете второй метод, вы потеряете свою способность (только при двойном щелчке, другое контекстное меню будет выглядеть нормально). Я бы предпочел использовать первый метод.

+0

Я попытался сделать ваше первое решение. Первая версия была неправильной, потому что onclick и мое меню также показаны. Затем я помещаю два меню: 0.) OnClick 1.) Установите диалог стиля, и я вызвал Edit только в случае 0. Это здорово, работает. Но: нужно ли мне освободить DefEditor в конце процедуры? Я не уверен сейчас ... – durumdara

+0

@durumdara: Нет, вам не нужно освобождать 'DefEditor', его интерфейс, и он будет уничтожен автоматически. –

+0

Спасибо, он работает хорошо, по мере необходимости! :-) – durumdara