📄 jvdataprovidereditors.pas
字号:
var
ICR: IInterfaceComponentReference;
begin
if GetProviderIntf = nil then
Result := ''
else
if Supports(GetProviderIntf, IInterfaceComponentReference, ICR) then
Result := ICR.GetComponent.Name
else
raise EPropertyError.CreateRes(@RsESpecifiedProviderIsNotATComponentDe);
end;
procedure TJvDataConsumerProperty.SetValue(const Value: string);
var
Comp: TComponent;
ProvIntf: IJvDataProvider;
Ref: IUnknown;
{$IFNDEF COMPILER6_UP}
List: IDesignerSelections;
Dsgnr: IFormDesigner;
{$ENDIF !COMPILER6_UP}
begin
{$IFNDEF COMPILER6_UP}
Dsgnr := Self.Designer;
{$ENDIF !COMPILER6_UP}
if Value = '' then
Comp := nil
else
Comp := Designer.GetComponent(Value);
if Comp <> nil then
begin
with Comp do
if not GetInterface(IInterfaceComponentReference, Ref) or not GetInterface(IJvDataProvider, ProvIntf) then
raise EPropertyError.CreateRes(@SInvalidPropertyValue);
end
else
ProvIntf := nil;
SetProviderIntf(ProvIntf);
{$IFNDEF COMPILER6_UP}
{ Force the object inspector to discard its property editors. Code copied from post from
Constantine Yannakopoulos in borland.public.delphi.vcl.components.writing }
List := CreateSelectionList;
Dsgnr.GetSelections(List);
Dsgnr.NoSelection; // Self will be gone here
Dsgnr.SetSelections(List);
Dsgnr.Modified;
{$ENDIF !COMPILER6_UP}
end;
procedure TJvDataConsumerProperty.GetValues(Proc: TGetStrProc);
begin
FOrgStrProc := Proc;
try
Designer.GetComponentNames(GetTypeData(TComponent.ClassInfo), CheckAndAddComp);
finally
FOrgStrProc := nil;
end;
end;
//=== { TJvDataProviderTreeProperty } ========================================
procedure TJvDataProviderTreeProperty.Edit;
begin
DesignProvider(TJvCustomDataProvider(GetComponent(0)), Designer, GetName);
end;
function TJvDataProviderTreeProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog, paReadOnly];
end;
function TJvDataProviderTreeProperty.GetValue: string;
begin
Result := 'Data tree'; // do not localize
end;
procedure TJvDataProviderTreeProperty.SetValue(const Value: string);
begin
end;
//=== { TJvDataProviderItemIDProperty } ======================================
procedure TJvDataProviderItemIDProperty.Edit;
begin
DataConsumerSelectItem(GetConsumerImpl, Designer);
end;
function TJvDataProviderItemIDProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog, paReadOnly];
end;
function TJvDataProviderItemIDProperty.GetValue: string;
var
Item: IJvDataItem;
Text: IJvDataItemText;
begin
GetConsumerImpl.Enter;
try
Item := TJvDataConsumerItemSelect(GetConsumerExt).GetItemIntf;
if Item <> nil then
begin
if Supports(Item, IJvDataItemText, Text) then
Result := Text.Caption
else
Result := '[ID:' + Item.GetID + ']';
end
else
Result := RsNone;
finally
GetConsumerImpl.Leave;
end;
end;
procedure TJvDataProviderItemIDProperty.SetValue(const Value: string);
begin
end;
//=== { TJvDataConsumerContextEditor } =======================================
procedure TJvDataConsumerContextProperty.Edit;
begin
if ConsumerSelectContext(GetConsumer) then
Designer.Modified;
end;
function TJvDataConsumerContextProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog];
end;
function TJvDataConsumerContextProperty.GetValue: string;
var
Ctx: IJvDataContext;
begin
Ctx := TJvDataConsumerContext(GetConsumerExt).ContextIntf;
if Ctx <> nil then
begin
Result := Ctx.Name;
repeat
Ctx := Ctx.Contexts.Ancestor;
if Ctx <> nil then
Result := Ctx.Name + '\' + Result;
until Ctx = nil;
end
else
Result := '';
end;
procedure TJvDataConsumerContextProperty.SetValue(const Value: string);
var
CtxList: IJvDataContexts;
Ctx: IJvDataContext;
begin
if Supports(GetConsumerImpl.ProviderIntf, IJvDataContexts, CtxList) then
begin
Ctx := CtxList.GetContextByName(Value);
if (Value = '') or (Value = '\') or (Ctx <> nil) then
begin
TJvDataConsumerContext(GetConsumerExt).ContextIntf := Ctx;
Designer.Modified;
end;
end;
end;
//=== { TJvConsumerNotifyComponentProperty } =================================
function TJvConsumerNotifyComponentProperty.IsValidComp(AComponent: TComponent): Boolean;
const
cProvider = 'Provider';
var
PI: PPropInfo;
Obj: TObject;
Consumer: IJvDataConsumer;
TmpNotifier: IJvDataConsumerClientNotify;
Srv: IJvDataConsumerServerNotify;
begin
Result := (AComponent is GetTypeData(GetPropType)^.ClassType);
if Result then
begin
PI := TypInfo.GetPropInfo(AComponent, cProvider);
if PI <> nil then
begin
Obj := TypInfo.GetObjectProp(AComponent, cProvider);
Result := Supports(Obj, IJvDataConsumer, Consumer) and
Supports(Consumer, IJvDataConsumerClientNotify, TmpNotifier) and
Supports(TJvDataConsumerClientNotifyItem(GetComponent(0)).List.Server.Controller,
IJvDataConsumerServerNotify, Srv) and Srv.IsValidClient(TmpNotifier);
end
else
Result := False;
end;
end;
procedure TJvConsumerNotifyComponentProperty.CheckAndAddComp(const S: string);
begin
if Assigned(EnumProc) and (S <> '') and IsValidComp(Designer.GetComponent(S)) then
EnumProc(S);
end;
procedure TJvConsumerNotifyComponentProperty.GetValues(Proc: TGetStrProc);
begin
EnumProc := Proc;
try
Designer.GetComponentNames(GetTypeData(TComponent.ClassInfo), CheckAndAddComp);
finally
EnumProc := nil;
end;
end;
//=== { TJvProviderEditor } ==================================================
function TJvProviderEditor.Provider: IJvDataProvider;
begin
Supports(Component, IJvDataProvider, Result);
end;
procedure TJvProviderEditor.Edit;
begin
if Provider.AllowProviderDesigner then
ExecuteVerb(0)
else
if Provider.AllowContextManager then
ExecuteVerb(1)
else
inherited Edit;
end;
procedure TJvProviderEditor.ExecuteVerb(Index: Integer);
begin
case Index of
0:
DesignProvider(Provider, Designer, '');
1:
ManageProviderContexts(Provider, Designer, '');
end;
end;
function TJvProviderEditor.GetVerb(Index: Integer): string;
begin
case Index of
0:
Result := RsTreeDesignerEllipsis;
1:
Result := RsContextManagerEllipsis;
else
Result := Format(RsInvalidVerbd, [Index]);
end;
end;
function TJvProviderEditor.GetVerbCount: Integer;
begin
Result := 2;
end;
{$IFDEF COMPILER6_UP}
procedure TJvProviderEditor.PrepareItem(Index: Integer; const AItem: IMenuItem);
{$ELSE}
procedure TJvProviderEditor.PrepareItem(Index: Integer; const AItem: TMenuItem);
{$ENDIF COMPILER6_UP}
begin
case Index of
0:
AItem.Enabled := Provider.AllowProviderDesigner;
1:
AItem.Enabled := Provider.AllowContextManager;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -