Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.01.17;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.006 c
6-52624
maxi
2001-10-22 16:17
2002.01.17
Как DCOM клиенту узнать об изменениях данных на сервере/базе


14-52656
kimblch
2001-11-21 05:09
2002.01.17
Как востановить исходники


3-52477
Макс
2001-12-14 13:32
2002.01.17
Фильтрация в ADOTable


14-52666
MJH
2001-11-18 13:56
2002.01.17
nVidia Drivers 21.88


6-52632
maxi
2001-10-23 09:20
2002.01.17
Своевременное обновление наборов данных на MIDAS Delphi5