cxlibraryreg.pas
来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 1,412 行 · 第 1/3 页
PAS
1,412 行
end;
{$IFDEF DELPHI6}
procedure TcxStyleProperty.PropDrawName(ACanvas: TCanvas; const ARect: TRect;
ASelected: Boolean);
begin
DefaultPropertyDrawName(Self, ACanvas, ARect);
end;
{$ENDIF}
procedure TcxStyleProperty.PropDrawValue(ACanvas: TCanvas; const ARect: TRect;
ASelected: Boolean);
begin
if GetVisualValue = '' then
{$IFDEF DELPHI6}
DefaultPropertyDrawValue(Self, ACanvas, ARect)
{$ELSE}
inherited
{$ENDIF}
else
ListDrawValue(GetVisualValue, ACanvas, ARect, ASelected);
end;
procedure TcxStyleProperty.ListMeasureWidth(const Value: string; ACanvas: TCanvas;
var AWidth: Integer);
var
AStyle: TcxStyle;
begin
AStyle := Designer.GetComponent(Value) as TcxStyle;
if AStyle <> nil then
Inc(AWidth, StylePreviewAreaWidth + StylePreviewAreaOffset);
end;
procedure TcxStyleProperty.ListMeasureHeight(const Value: string; ACanvas: TCanvas;
var AHeight: Integer);
var
AComponent: TComponent;
AStyle: TcxStyle;
APrevFont: TFont;
function GetItemHeight: Integer;
begin
Result := ACanvas.TextHeight('Qq') +
2 * (StylePreviewOffset + StylePreviewBorderSize + StyleTextOffset);
end;
begin
AComponent := Designer.GetComponent(Value);
if AComponent = nil then
Inc(AHeight)
else
if AComponent is TcxStyle then
begin
AStyle := TcxStyle(AComponent);
AHeight := GetItemHeight;
if svFont in AStyle.AssignedValues then
begin
APrevFont := TFont.Create;
APrevFont.Assign(ACanvas.Font);
ACanvas.Font := AStyle.Font;
AHeight := Max(AHeight, GetItemHeight);
ACanvas.Font := APrevFont;
APrevFont.Free;
end;
end;
end;
procedure TcxStyleProperty.ListDrawValue(const Value: string; ACanvas: TCanvas;
const ARect: TRect; ASelected: Boolean);
const
PreviewText = 'Text Text Text Text Text';
var
AStyle: TcxStyle;
APrevBkColor, APrevTextColor: COLORREF;
APrevFont: TFont;
procedure SaveCanvasParams;
begin
APrevBkColor := GetBkColor(ACanvas.Handle);
APrevTextColor := GetTextColor(ACanvas.Handle);
APrevFont := TFont.Create;
APrevFont.Assign(ACanvas.Font);
end;
procedure RestoreCanvasParams;
begin
ACanvas.Font := APrevFont;
APrevFont.Free;
SetBkColor(ACanvas.Handle, APrevBkColor);
SetTextColor(ACanvas.Handle, APrevTextColor);
end;
function GetStyleNameRect: TRect;
begin
Result := ARect;
Inc(Result.Left, StylePreviewAreaWidth + StylePreviewAreaOffset + StyleTextOffset);
Result.Top := (Result.Top + Result.Bottom - ACanvas.TextHeight(Value)) div 2;
end;
(*procedure DrawStyleAssignedValuesInfo;
const
StyleValuesText = 'BCFT';
var
AInfoItemWidth, I, ATextX, ATextY: Integer;
AStyleValue: TcxStyleValue;
begin //!!!
//ACanvas.Font.Style := [fsBold];
AInfoItemWidth := 0;
for I := 1 to Length(StyleValuesText) do
AInfoItemWidth := Max(AInfoItemWidth, ACanvas.TextWidth(StyleValuesText[I]));
with GetStyleNameRect do
begin
ATextX := Left - 40; //!!!
ATextY := Top;
end;
for AStyleValue := Low(TcxStyleValue) to High(TcxStyleValue) do
begin
if AStyleValue in AStyle.AssignedValues then
//ACanvas.Font.Style := [fsBold]
ACanvas.Font.Color := APrevFont.Color
else
ACanvas.Font.Color := clBtnFace;
//ACanvas.Font.Style := [];
ACanvas.TextOut(ATextX, ATextY, StyleValuesText[1 + Ord(AStyleValue)]);
Inc(ATextX, AInfoItemWidth);
end;
//ACanvas.Font.Style := [];
end;*)
function GetPreviewBounds: TRect;
begin
Result := ARect;
Result.Right := Result.Left + StylePreviewAreaWidth;
InflateRect(Result, -StylePreviewOffset, -StylePreviewOffset);
end;
function GetPreviewClientBounds: TRect;
begin
Result := GetPreviewBounds;
InflateRect(Result, -StylePreviewBorderSize, -StylePreviewBorderSize);
end;
procedure DrawPreviewBorder;
function GetBorderColor: TColor;
begin
if AStyle.AssignedValues * [svBitmap, svColor] = [] then
if ColorToRGB(ACanvas.Brush.Color) = ColorToRGB(clBtnFace) then
Result := clBtnShadow
else
Result := clBtnFace
else
Result := clWindowText;
end;
begin
ACanvas.Brush.Color := GetBorderColor;
ACanvas.FrameRect(GetPreviewBounds);
end;
procedure DrawPreviewBackground;
var
R, ABitmapR: TRect;
AcxCanvas: TcxCanvas;
begin
R := GetPreviewClientBounds;
if svBitmap in AStyle.AssignedValues then
begin
ABitmapR := R;
if svColor in AStyle.AssignedValues then
ABitmapR.Right := (R.Left + R.Right) div 2;
AcxCanvas := TcxCanvas.Create(ACanvas);
AcxCanvas.FillRect(ABitmapR, AStyle.Bitmap);
AcxCanvas.Free;
R.Left := ABitmapR.Right;
end;
if svColor in AStyle.AssignedValues then
begin
ACanvas.Brush.Color := AStyle.Color;
ACanvas.FillRect(R);
end;
end;
procedure DrawPreviewText;
var
ATextR: TRect;
function GetTextColor: TColor;
begin
if svTextColor in AStyle.AssignedValues then
Result := AStyle.TextColor
else
{if svColor in AStyle.AssignedValues then
Result := ColorToRGB(AStyle.Color) xor clWhite //!!!
else}
Result := APrevFont.Color;
end;
function GetTextTopBound: Integer;
begin
Result := (ATextR.Top + ATextR.Bottom - ACanvas.TextHeight(PreviewText)) div 2;
end;
begin
if AStyle.AssignedValues * [svFont, svTextColor] = [] then Exit;
if svFont in AStyle.AssignedValues then
ACanvas.Font := AStyle.Font;
ACanvas.Font.Color := GetTextColor;
ATextR := GetPreviewClientBounds;
ACanvas.Brush.Style := bsClear;
ACanvas.TextRect(ATextR, ATextR.Left + StyleTextOffset, GetTextTopBound, PreviewText);
ACanvas.Brush.Style := bsSolid;
end;
begin
AStyle := Designer.GetComponent(Value) as TcxStyle;
if AStyle = nil then
{$IFDEF DELPHI6}
DefaultPropertyListDrawValue(Value, ACanvas, ARect, ASelected)
{$ELSE}
inherited
{$ENDIF}
else
begin
SaveCanvasParams; // for correct focus rect drawing and height measurement
with GetStyleNameRect do
ACanvas.TextRect(ARect, Left, Top, Value);
//DrawStyleAssignedValuesInfo;
DrawPreviewBorder;
DrawPreviewBackground;
DrawPreviewText;
RestoreCanvasParams;
end;
end;
function TcxStyleProperty.GetStyleRepositories: TList;
begin
Result := TList.Create;
FStyleRepositories := Result;
Designer.GetComponentNames(GetTypeData(TcxStyleRepository.ClassInfo), GetStyleRepositoryNameProc);
end;
function TcxStyleProperty.AutoFill: Boolean;
begin
Result := False;
end;
procedure TcxStyleProperty.GetValues(Proc: TGetStrProc);
var
AStyleRepositories: TList;
I: Integer;
S: string;
begin
AStyleRepositories := GetStyleRepositories;
try
for I := 0 to AStyleRepositories.Count - 1 do
begin
S := Designer.GetComponentName(TComponent(AStyleRepositories[I]));
Proc(sCreateNewStyleInRepositoryBegin + S + sCreateNewStyleInRepositoryEnd);
end;
finally
AStyleRepositories.Free;
end;
Proc(sCreateNewStyleInNewRepository);
inherited;
end;
procedure TcxStyleProperty.SetValue(const Value: string);
var
AName: string;
AStyleRepository: TcxStyleRepository;
procedure CreateAndAssignNewStyle(AStyleRepository: TcxStyleRepository);
var
AStyle: TcxStyle;
function GetStyleDesigner: IDesigner;
begin
Result := FindRootDesigner(AStyle) as IDesigner;
//FindRootDesigner(AStyle).QueryInterface(IDesigner, Result);
end;
begin
AStyle := AStyleRepository.CreateItemEx(TcxStyle, AStyleRepository.Owner) as TcxStyle;
AStyle.Name := CreateUniqueName(AStyle.Owner, nil, AStyle, '', '');
if GetStyleDesigner <> Designer then
FindRootDesigner(AStyle).Modified;
SetOrdValue(Integer(AStyle));
end;
begin
if Value = sCreateNewStyleInNewRepository then
begin
AStyleRepository := TcxStyleRepository.Create(Designer.{$IFDEF DELPHI6}Root{$ELSE}GetRoot{$ENDIF});
AStyleRepository.Name := Designer.UniqueName(
Copy(TcxStyleRepository.ClassName, 2, Length(TcxStyleRepository.ClassName) - 1));
CreateAndAssignNewStyle(AStyleRepository);
end
else
if Copy(Value, 1, Length(sCreateNewStyleInRepositoryBegin)) = sCreateNewStyleInRepositoryBegin then
begin
AName := Copy(Value, Length(sCreateNewStyleInRepositoryBegin) + 1,
Length(Value) - (Length(sCreateNewStyleInRepositoryBegin) + Length(sCreateNewStyleInRepositoryEnd)));
CreateAndAssignNewStyle(Designer.GetComponent(AName) as TcxStyleRepository);
end
else
inherited;
end;
{ TcxBitmapGraphicProperty }
procedure TcxBitmapGraphicProperty.Edit;
var
PictureEditor: TPictureEditor;
PictureEditorDlg: TWinControl;
begin
PictureEditor := TPictureEditor.Create(nil);
try
PictureEditor.GraphicClass := TGraphicClass(GetTypeData(GetPropType)^.ClassType);
PictureEditor.Picture.Graphic := TGraphic(Pointer(GetOrdValue));
with PictureEditor do
begin
if BuildFilter <> '' then
begin
PictureEditorDlg := FindControl(FindWindow('TPictureEditorDlg', nil));
if PictureEditorDlg is TPictureEditorDlg then
TPictureEditorDlg(PictureEditorDlg).OnShow := OnShowPicEdit;
end;
if Execute then
if (Picture.Graphic = nil) or (Picture.Graphic is GraphicClass) then
SetOrdValue(LongInt(Picture.Graphic))
else
if Picture.Graphic is TdxPNGImage then
SetOrdValue(LongInt(TdxPNGImage(Picture.Graphic).GetAsBitmap))
else
raise Exception.CreateRes(@SInvalidFormat)
end;
finally
PictureEditor.Free;
end;
end;
function TcxBitmapGraphicProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog];
end;
function TcxBitmapGraphicProperty.GetValue: string;
var
Graphic: TGraphic;
begin
Graphic := TGraphic(GetOrdValue);
if (Graphic = nil) or Graphic.Empty then
Result := 'None'
else
Result := '(' + Graphic.ClassName + ')';
end;
procedure TcxBitmapGraphicProperty.SetValue(const Value: string);
begin
if Value = '' then SetOrdValue(0);
end;
procedure TcxBitmapGraphicProperty.OnShowPicEdit(Sender: TObject);
begin
if Sender is TPictureEditorDlg then
TPictureEditorDlg(Sender).OpenDialog.Filter := BuildFilter;
end;
function TcxBitmapGraphicProperty.BuildFilter: string;
begin
Result := '';
end;
{ TcxBitmapProperty }
function TcxBitmapProperty.BuildFilter: string;
begin
if CheckGdiPlus then
Result := sdxBitmapAndPNGFilter
else
Result := '';
end;
{ TcxFilenameProperty }
procedure TcxFilenameProperty.Edit;
var
ADialog: TOpenDialog;
begin
ADialog := TOpenDialog.Create(Application);
ADialog.Filename := GetValue;
ADialog.Filter := GetFilter;
ADialog.Options := ADialog.Options + [ofPathMustExist, ofFileMustExist];
try
if ADialog.Execute then
SetValue(ADialog.Filename);
finally
ADialog.Free;
end;
end;
function TcxFilenameProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog, paRevertable];
end;
function TcxFilenameProperty.GetFilter: string;
begin
Result := 'All files (*.*)|*.*';
end;
procedure HideClassProperties(AClass: TClass; APropertyNames: array of string);
var
I: Integer;
begin
for I := Low(APropertyNames) to High(APropertyNames) do
RegisterPropertyEditor(GetPropInfo(AClass, APropertyNames[I]).PropType^,
AClass, APropertyNames[I], nil);
end;
procedure Register;
begin
{$IFDEF DELPHI9}
ForceDemandLoadState(dlDisable);
{$ENDIF}
RegisterComponentEditor(TcxLookAndFeelController, TcxLookAndFeelControllerEditor);
RegisterPropertyEditor(TypeInfo(TcxCustomStyleSheet), TcxStyles, 'StyleSheet', TcxStyleSheetComponentProperty);
RegisterComponentEditor(TcxStyleRepository, TcxStyleRepositoryComponentEditor);
RegisterComponentEditor(TcxImageList, TcxImageListComponentEditor);
RegisterComponentEditor(TcxPropertiesStore, TcxPropertiesStoreComponentEditor);
RegisterComponents(dxLibraryProductPage, [TcxPropertiesStore, TcxImageList]);
RegisterPropertyEditor(TypeInfo(TBitmap), nil, '', TcxBitmapGraphicProperty);
RegisterComponents(dxLibraryProductPage, [TcxLookAndFeelController, TcxStyleRepository]);
RegisterPropertyEditor(TypeInfo(TcxStyleController), TcxStyleController, 'FakeStyleController', nil);
RegisterPropertyEditor(TypeInfo(TcxStyleController), TcxContainer, 'FakeStyleController', nil);
RegisterPropertyEditor(TypeInfo(TcxContainerStyle), TcxContainer, '', TcxContainerStyleProperty);
RegisterPropertyEditor(TypeInfo(TcxContainerStyle), TcxStyleController, '',
TcxStyleControllerStyleProperty);
RegisterPropertyEditor(TypeInfo(TComponent), TcxControl, 'PopupMenu', TcxControlPopupMenuProperty);
RegisterPropertyEditor(TypeInfo(TcxStyle), nil, '', TcxStyleProperty);
RegisterClasses([TcxStyle]);
RegisterNoIcon([TcxStyle]);
RegisterPropertyEditor(TypeInfo(TcxContainerStyleValues), TcxContainerStyle,
'AssignedValues', TcxContainerStyleAssignedValuesProperty);
RegisterPropertyEditor(TypeInfo(TcxLookAndFeel), nil, '', TcxLookAndFeelProperty);
RegisterPropertyEditor(TypeInfo(TdxSkinName), nil, 'SkinName', nil);
RegisterPropertyEditor(TypeInfo(TcxLookAndFeelValues), TcxLookAndFeel,
'AssignedValues', TcxLookAndFeelAssignedValuesProperty);
end;
{$IFDEF DELPHI6}
initialization
StartClassGroup(TControl);
GroupDescendentsWith(TcxCustomPropertiesStore, TControl);
{$ENDIF}
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?