Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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]

Спасибо. Вы - гений.
Вопрос снят.




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.17;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.021 c
1-52553           Flagman               2001-12-28 12:14  2002.01.17  
Спрятать курсор в TRichEdit


3-52473           З.Г.                  2001-12-04 07:24  2002.01.17  
Как отключить автоматическое сохранение данных в таблице, т.е. чтобы я мог внести данные и самому выбрать сохранить или не сохранять таблицу


14-52647          gone                  2001-11-22 16:25  2002.01.17  
Киньте пару ссылок pls


3-52507           Softmaster            2001-12-16 14:46  2002.01.17  
Проблема с группировкой в отчете при использовании QReport


14-52651          atmospheric           2001-11-22 18:07  2002.01.17  
Cитуация морального выбора