-
Я ничего не понимаю, У вас есть столбец, в нём 3 редактора ? В каждой строчке одинаковые 3 редактора ? Или в каждой строчке разные редакторы (по типу) ???
-
>У вас есть столбец, в нём 3 редактора ?
В том примере что я выложил в первом столбце 3 редактора во втором 1. Вообще же может быть в каждом столбце сколько угодно редакторов. Столбцы друг от друга не зависят.
В кажом стролбце могут быть как одинаковые так и разные редакторы.
Т.е. сейчас к каждому столбцу прикручен экзампляр класса унаследованного от TCollection.
-
Стало понятнее?
-
Начните с случая попроще: 1 столбец - 1 редактор.
TBaseEditor = class
protected
procedure Draw; virtual;abstract; procedure Edit; virtual;abstract; function GetValue: variant; virtual;abstract; procedure SetValue(Value: variant);virtual;abstract; end;
-
Вопрос скорее не про то как сделать редактор а как его грамотно подсунуть компоненту в дизайнтайме и настроить его свойства.
-
TMyEditors = (eCheck, eEdit, eCyrrency, eButton);
TMyBaseEditor = class(TPersistent)
end;
TMYComponent = class(TComponent)
published
property Editor: TBaseEditor read fEditor;
property TypeEditor: TMyEditors read fTypeEditor write SetTypeEditor;
end;
procedure SetTypeEditor(Value: TMyEditors);
var Old: TBaseEditor;
begin
if fTypeEditor = Value then Exit;
Old := Editor; try
case Value of eCheck: fEditor := TMyCheckEditor.Create();
eEdit: fEditor := TMyEditEditor.Create();
..............
end;
finally
FreeAndNil(Old); fTypeEditor := Value;
end;
end;
-
Как делать со списком понятно. А как делать если появился новый редактор? Которого не было на момент написания компонента?
Т.е. когда список TMyEditors = (eCheck, eEdit, eCyrrency, eButton); расширен новым редактором?
-
Значит ввести текстовый список ('eCheck', 'eEdit', 'eCyrrency', 'eButton'), плюс регистрация нового редактора. Тогда свойство TypeEditor будет выглядеть так property TypeEditor: string read fTypeEditor write SetTypeEditor;
var fRegisterEditorList: TStringsList;
procedure RegistrEditor(TypeEditor: string; ClassEditor: TBaseEditor);
begin
if not Assigned(fRegisterEditorList) then fRegisterEditorList := TStringList.Create;
if fRegisterEditorList.IndexOf(TypeEditor) >= 0 then Exit;
fRegisterEditorList.AddObject(TypeEditor,ClassEditor);
end;
procedure SetTypeEditor(Value: string);
var Old: TBaseEditor;
n: integer;
f: boolean;
begin
if fTypeEditor = Value then Exit;
Old := Editor; try
f := false;
for i := 0 to fRegisterEditorList.Count-1 do
if SameText(fRegisterEditorList[i],Value) then begin
fEditor := TMyBaseEditor(fRegisterEditorList.Objects[i]).Create();
f := true;
Break;
end;
if not f then Exit;
finally
FreeAndNil(Old); fTypeEditor := Value;
end;
end;
initialization
RegistrEditor('eCheck',TMyCheckEditor);
RegistrEditor('eEdit',TMyEditEditor);
end.
initialization
RegistrEditor('eButton',TMyButtonEditor);
end.
-
!!! Передавать имя класса через строку я не догадался... Всё искал как же получить список доступных в дизайн тайме эдиторов.
Бальшущее спасибо.
-
Для свойства можно организовать редактор свойства, который и будет показывать список доступных редакторов (тавтология какая-то).
|