![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Непонятная ошибка в редакторе компонента
TStas © (2006-01-15 00:23:00)Написал компонент - диалог поиска в папке. Работает замечательно, два редактора свойств - тоже. Написал редактор компонента, не то, чтобы сильно нужный, но, чтобы просто в DesignTime'е диалог вызывал, как у других диалоговых компонетов. В меню появился, ошибок компиляции нет, но при двойном щелчке на компоненте в DesignTime'е вылезает ошибка, что в модуле rtl70.bpl ошибка по какому-то адресу (но не nil). Вот код модуля:
unit stFolderSearchDialogEditor;
interface
uses
DesignIntf, DesignEditors;
type
TstFolderSearchDialogEditor = Class(TComponentEditor)
public
function GetVerbCount: Integer; override;
function GetVerb(Index: Integer): String; override;
procedure ExecuteVerb(Index: Integer); override;
end;
procedure Register;
implementation
uses stFolderSearchDialog, SysUtils;
procedure Register;
begin
RegisterComponentEditor(TstFolderSearchDialog, TstFolderSearchDialogEditor)
end;
{ TstFolderSearchDialogEditor }
procedure TstFolderSearchDialogEditor.ExecuteVerb(Index: Integer);
begin
case Index of
0: TstFolderSearchDialog(Component).Execute;
end;
end;
function TstFolderSearchDialogEditor.GetVerb(Index: Integer): String;
begin
case Index of
0: Result := 'Test dialog';
end;
end;
function TstFolderSearchDialogEditor.GetVerbCount: Integer;
begin
Result := 1;
end;
end.
Нашел файл rtl70.bpl. Он живет в папке System32, что он там делает - не знаю, я его не писал. И в чем может быть дело?
Юрий Зотов (2006-01-16 14:17:00) [21]> Rouse_ © (16.01.06 09:01) [6]
Саш, в сабже к меню добавляется 1 пункт. Если у тебя есть непреодолимое желание писать case из одной ветки - пиши. Я не против, чес-слово.
Только другим такое не советуй, плз. Тут я против. И буду применять синий карандаш. Обязан даже.
Rouse_ (2006-01-16 09:01:00) [22]
> В этом случае нужно писать что нить типа такого:
Именно так это и пишеться :)
Юрий Зотов (2006-01-15 23:55:00) [23]> jack128 © (15.01.06 20:56) [4]
Точно так, но это даже не главное (даже при наследовании индексация новых пунктов меню у каждого нового наследника все равно начинается с нуля).
Основная суть в том, чтобы функция, которую вызывает среда, всегда возвращала "хорошее" значение, а не случайный мусор, как в [0]. Иначе реакция среды может быть непредсказуемой - и возможно, что причина сабжа как раз в этом и есть.
jack128 (2006-01-15 20:56:00) [24]Rouse_ © (15.01.06 19:32) [2]
Я так понял, ЮЗ хочет, чтобы всё это барахло работало если редакторы насдедуются друг от друга. В этом случае нужно писать что нить типа такого:
function TstFolderSearchDialogEditor.GetVerb(Index: Integer): String;;
begin
case Index - inherited GetVerbCount of
0: ...;
1: ...;
2: ...;
else
Result := inherited GetVerb(Index)
end
end
Юрий Зотов (2006-01-15 20:50:00) [25]> Rouse_ © (15.01.06 19:32) [2]
case Index - GetVerbCount + 1 of
:o)
Rouse_ (2006-01-15 19:32:00) [26]
> Юрий Зотов © (15.01.06 04:02) [1]
Круто.. У меня 4 обработчика, и что я буду делать вот с этим:
if Index = GetVerbCount - 1 then
?
Юрий Зотов (2006-01-15 04:02:00) [27]procedure TstFolderSearchDialogEditor.ExecuteVerb(Index: Integer);
begin
if Index = GetVerbCount - 1 then
TstFolderSearchDialog(Component).Execute
else
inherited
end;
function TstFolderSearchDialogEditor.GetVerb(Index: Integer): String;
begin
if Index = GetVerbCount - 1 then
Result := 'Test dialog'
else
Result := inherited GetVerb(Index)
end;
function TstFolderSearchDialogEditor.GetVerbCount: Integer;
begin
Result := inherited GetVerbCount + 1
end;
Не факт, что это поможет, но писать все равно надо так.