Обработчики событий в диалоговых компонентах
При разработке собственных компонент для диалоговой формы обработчики
событий не опознаются в дизайнере в качестве таковых, поскольку в C++
Builder тип обработчика в TypeInfo.Name не TfrxEvent, а AnsiString.
Исправить можно например так:
Файл frxDsgnIntf.pas
function TfrxPropertyEditorCollection.GetPropertyEditor(PropertyType: PTypeInfo;
Component: TPersistent; PropertyName: String): Integer;
var
i: Integer;
Item: TfrxPropertyEditorItem;
begin
if (Pos('tfrx', LowerCase(PropertyType.Name)) = 1) and
(Pos('event', LowerCase(PropertyType.Name)) = Length(PropertyType.Name) - 4) then
begin
Result := FEventEditorItem;
Exit;
end;
{Patched for C++ Builder compatibility}
{Patch start}
if (Pos('On', PropertyName) = 1) and
(Pos('AnsiString',PropertyType.Name) = 1) then
begin
Result := FEventEditorItem;
Exit;
end;
{Patch end}
Файл frxInsp.pas
procedure TfrxObjectInspector.SetSelectedObjects(Value: TList);
var
i: Integer;
s: String;
procedure CreateLists;
var
i: Integer;
p: TfrxPropertyItem;
s: String;
begin
if FPropertyList <> nil then
FPropertyList.Free;
if FEventList <> nil then
FEventList.Free;
FEventList := nil;
FPropertyList := frxCreatePropertyList(Value, FDesigner);
{Patched for C++ Builder compatibility}
{Patch start}
if FPropertyList <> nil then
begin
FEventList := TfrxPropertyList.Create(FDesigner);
i := 0;
while i < FPropertyList.Count do
begin
p := FPropertyList;
s := p.Editor.PropInfo.PropType^.Name;
if (Pos('Tfrx', s) = 1) and (Pos('Event', s) = Length(s) - 4) then
p.Collection := FEventList
else
if (Pos('On', p.Editor.PropInfo.Name) = 1) and
(Pos('AnsiString',s) = 1) then
p.Collection := FEventList
else
Inc(i);
end;
end;
{Patch end}
событий не опознаются в дизайнере в качестве таковых, поскольку в C++
Builder тип обработчика в TypeInfo.Name не TfrxEvent, а AnsiString.
Исправить можно например так:
Файл frxDsgnIntf.pas
function TfrxPropertyEditorCollection.GetPropertyEditor(PropertyType: PTypeInfo;
Component: TPersistent; PropertyName: String): Integer;
var
i: Integer;
Item: TfrxPropertyEditorItem;
begin
if (Pos('tfrx', LowerCase(PropertyType.Name)) = 1) and
(Pos('event', LowerCase(PropertyType.Name)) = Length(PropertyType.Name) - 4) then
begin
Result := FEventEditorItem;
Exit;
end;
{Patched for C++ Builder compatibility}
{Patch start}
if (Pos('On', PropertyName) = 1) and
(Pos('AnsiString',PropertyType.Name) = 1) then
begin
Result := FEventEditorItem;
Exit;
end;
{Patch end}
Файл frxInsp.pas
procedure TfrxObjectInspector.SetSelectedObjects(Value: TList);
var
i: Integer;
s: String;
procedure CreateLists;
var
i: Integer;
p: TfrxPropertyItem;
s: String;
begin
if FPropertyList <> nil then
FPropertyList.Free;
if FEventList <> nil then
FEventList.Free;
FEventList := nil;
FPropertyList := frxCreatePropertyList(Value, FDesigner);
{Patched for C++ Builder compatibility}
{Patch start}
if FPropertyList <> nil then
begin
FEventList := TfrxPropertyList.Create(FDesigner);
i := 0;
while i < FPropertyList.Count do
begin
p := FPropertyList;
s := p.Editor.PropInfo.PropType^.Name;
if (Pos('Tfrx', s) = 1) and (Pos('Event', s) = Length(s) - 4) then
p.Collection := FEventList
else
if (Pos('On', p.Editor.PropInfo.Name) = 1) and
(Pos('AnsiString',s) = 1) then
p.Collection := FEventList
else
Inc(i);
end;
end;
{Patch end}
Комментарии
Все это тянется еще с FR3, этот код остался прежним.