Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.59 MB
Время: 0.02 c
3-52459
dorosh
2001-12-14 06:55
2002.01.17
Как в DbGrid перерисовать ячейку


3-52505
Кнопка
2001-12-09 15:07
2002.01.17
Поиск в базе


1-52534
Andrey196
2001-12-26 18:28
2002.01.17
Как у combobox скрыть строку ввода, и чтобы первый item был виден на этой строке


14-52650
paul_shmakov
2001-11-21 01:13
2002.01.17
подсветка синтаксиса в форуме


3-52506
Игорь
2001-12-16 04:00
2002.01.17
Редактор полей в D6





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский