-
Нашёл в интернете пример создания редактора свойства, вызывающего стандартный диалог TStringsEditDlg, но работающий не со свойством типа TStrings, а со свойством типа String. Всё работает нормально, но вот кнопка "Code Editor..." в этом диалоге почему-то просто закрывает диалог. Что ещё нужно переопределить в редакторе свойства, чтобы эта кнопка тоже заработала? Ниже полностью модуль с исходным кодом редактора свойств:
unit TestikUnit;
interface
uses
Controls, ExtCtrls, DesignIntf, DesignEditors, StringsEdit;
procedure Register;
implementation
type
TMultiStringProperty = class(TStringProperty)
public
function GetAttributes: TPropertyAttributes; override;
procedure Edit; override;
end;
procedure TMultiStringProperty.Edit;
var
Dlg: TStringsEditDlg;
begin
Dlg:=TStringsEditDlg.Create(nil);
try
Dlg.Lines.Text:=Value;
if Dlg.ShowModal=mrOk then
Value:=Copy(Dlg.Lines.Text,1,Length(Dlg.Lines.Text)-2);
finally
Dlg.Free;
end;
end;
function TMultiStringProperty.GetAttributes: TPropertyAttributes;
begin
Result := inherited GetAttributes + [paDialog];
end;
procedure Register;
begin
RegisterPropertyEditor(TypeInfo(TCaption), TPanel, 'Caption', TMultiStringProperty);
end;
end.
-
StrEdit - всё уже написано
-
> DimaBr © (18.01.10 08:46) [1] > StrEdit - всё уже написано
Хм? В модуле StrEdit описан только абстрактный класс TStrEditDlg , от которого уже происходит класс TStringsEditDlg из модуля StringsEdit о котором я и написал в вопросе... Абстрактный класс мне ничем не поможет, так что вопрос остаётся в силе...
-
В модуле StrEdit описан метод создавания нового окна в редаторе кода
-
case ShowModal of
mrOk: SetStrings(Lines);
mrYes:
begin
// the unregister is done over in ComponentDesigner's finalization
StFilSys.Register;
Stream := TStringStream.Create('');
Lines.SaveToStream(Stream);
Stream.Position := 0;
Age := Now;
Module := ModuleServices.CreateModule(
TStringsModuleCreator.Create(Ident, Stream, Age));
if Module <> nil then
begin
with StringsFileSystem.GetTStringsProperty(Ident, Component, GetName) do
DiskAge := DateTimeToFileDate(Age);
Editor := Module.GetModuleFileEditor(0);
if FModified then
Editor.MarkModified;
Editor.Show;
end;
end;
-
> DimaBr © (18.01.10 12:48) [3] > В модуле StrEdit описан метод создавания нового окна в редаторе > кода
Честно новоря не уловил смысл... 1. Нужно наследовать редактор от TStringListProperty , а не от TStringProperty ? Но тогда начинают сыпаться ошибки (при нажатии кнопки с троеточием в инспекторе объектов - Access Violation), но это и понятно, ведь TStringListProperty предназначен для редактирования свойств типа TStrings , а нужно чтобы многострочный редактор работал для свойств типа String . ( TStringListProperty для свойств типа TStrings работает замечательно - проверил, а вот для свойств типа String глючит - видимо ещё чтото нужно переопределять, а что? - непонятно) 2. Или же нужно скопировать приведённый кусок в свой редактор свойства? Но это тоже не работает - в частности класс TStringsModuleCreator объявлен в секции implementation модуля StrEdit и по этой причине его ну никак нельзя сконструировать явно...
-
Никто не говорил, что нужно унаследовать этот редактор. Вы пятаетесть прикрутить классовый редактор для стрингового свойства, я вам показываю, как создаётся то самое дополнительное окно в редакторе кода, что не понятно ?
Вам нужно написать соответствующую реакцию на mrYes
|