Форум: "Основная";
Текущий архив: 2002.01.17;
Скачать: [xml.tar.bz2];
ВнизProperty FileName Найти похожие ветки
← →
Eduard (2001-12-27 12:34) [0]Здрасьте, мастаки ! Вот к меня какое дело: я создаю компонент с опубликованным свойством FileName типа string. Как мне сделать так, чтобы в Object Inspector при назначении компоненту этого свойства открывался диалог открытия файла, а не простая форма для ввода строки. Вопрос вроде бы ламерский, но я перекопал кучу исходников компонент, у которых имеется подобное свойство (типа TAnimate, TClientDataSet, и др.), вроде бы свойство FileName у меня описано точь-в-точь так же, но работает не так, как надо. Помогите, плиз, несчастному ламеру.
Если вдруг вопрос не совсем понятен, распишу подробно, хотя, подробнее, вроде бы некуда.
← →
WAM (2001-12-27 12:38) [1]Adding property editors - раздел в справке
← →
Slava (2001-12-27 13:15) [2]Попробуй использовать тип не String, а TFileName
← →
Eduard (2001-12-27 13:23) [3]Тоже самое. TFileName = type String
← →
Slava (2001-12-27 13:31) [4]Что тоже самое?
Правда у меня Д6, а в нем к типу TFileName PropertyEditor
уже подцеплен - диалог выбора файла. Может и в Д5 также?
← →
Eduard (2001-12-27 13:41) [5]Проверено - не подцеплен. Если вместо string указать TFileName, в Инспекторе напротив свойства даже кнопки нет.
← →
Юрий Зотов (2001-12-27 13:59) [6]Так напишите свой редактор свойства, какие проблемы?
WAM подсказал, где смотреть. См. также модуль DsgnIntf - там очень подробные комментарии.
← →
Иван Шихалев (2001-12-27 17:13) [7]Что-то мне Delphi ставить в лом, но насколько я помню в Delphi 5 на TFileName редактор с диалогом выбора был уже повешен.
← →
Eduard (2001-12-27 18:20) [8]Не прицеплен. Даже если бы и был прицеплен, возникает другой вопрос: как к диалогу выбора прицепить фильтры.
Короче, сделал я примерно так:
type
THighRichEdit = class(TRichEdit)
private
FHighlightSyntax: Boolean;
FReservedWords: TStrings;
FFileName: string;
procedure SetHighlightSyntax(const Value: Boolean);
procedure SetReservedWords(const Value: TStrings);
procedure SetFilename(const Value: string);
protected
{ Protected declarations }
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property FileName: string read FFileName write SetFileName;
property HighlightSyntax: Boolean read FHighlightSyntax write SetHighlightSyntax default False;
property ReservedWords: TStrings read FReservedWords write SetReservedWords;
end;
TTextFilePropertyEditor = class(TPropertyEditor)
procedure Edit; override;
end;
procedure Register;
....
implementation
procedure Register;
begin
RegisterComponents("Samples", [THighRichEdit]);
RegisterPropertyEditor(TypeInfo(THighRichEdit), THighRichEdit, "FileName", TTextFilePropertyEditor);
end;
{ THighRichEdit }
constructor THighRichEdit.Create(AOwner: TComponent);
var I: Integer;
begin
inherited Create(AOwner);
Width := 180;
Height := 300;
ParentColor := False;
...
end;
destructor THighRichEdit.Destroy;
begin
inherited Destroy;
...
end;
procedure THighRichEdit.SetFilename(const Value: string);
begin
FFileName := Value;
end;
...
...
{ TTextFilePropertyEditor }
procedure TTextFilePropertyEditor.Edit;
var OpenDialog: TOpenDialog;
begin
try
OpenDialog := TOpenDialog.Create(Application);
OpenDialog.Filter := "
← →
Юрий Зотов (2001-12-27 20:29) [9]1. Наследуйте TTextFilePropertyEditor от TStringProperty. Класс TPropertyEditor слишком общий, здесь он плохо подходит.
2. Измените регистрацию. Правильно так:
RegisterPropertyEditor(TypeInfo(string), ...);
3. Измените метод Edit. Более грамотный код такой:
procedure TTextFilePropertyEditor.Edit;
begin
with TOpenDialog.Create(Application) do
try
Filter := ...;
if Execute then SetStrValue(FileName);
finally
Free
end
end;
4. Вынесите редактор и процедуру Register в отдельный Unit, а в нем напишите uses ..., HighRichEdit (обычно для этого пишут специальный модуль регистрации). Иначе они будут "подтягиваться" в любой EXE, использующий Ваш компонент - а это совсем ни к чему.
И все должно стать ОК. Только советую изменить имя класса редактора. Если следовать принятым соглашениям, то он должен заканчиваться словом "Property" - например, TMyFileNameProperty.
← →
Eduard (2001-12-28 09:18) [10]>> Юрий Зотов
Огромное Вам спасибо. Сейчас буду пробовать.
← →
Eduard (2001-12-28 11:05) [11]... только кнопка из Инспектора куда-то исчезла, хотя при double-click на свойстве диалог показывается нормально...
← →
Юрий Зотов (2001-12-28 11:38) [12]Чтобы в Инспекторе появилась кнопка, заместите в редакторе еще один метод - GetAttributes. В нем - одна строка:
Result := inherited GetAttributes + [paDialog]
← →
Eduard (2001-12-28 11:46) [13]Спасибо. Вы - гений.
Вопрос снят.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.01.17;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.003 c