📄 vcleditors.pas
字号:
begin
AWidth := AWidth + ACanvas.TextHeight('X') * 2;
end;
procedure TPenStyleProperty.ListMeasureHeight(const Value: string;
ACanvas: TCanvas; var AHeight: Integer);
begin
// No implementation necessary
end;
procedure TPenStyleProperty.PropDrawName(ACanvas: TCanvas;
const ARect: TRect; ASelected: Boolean);
begin
DefaultPropertyDrawName(Self, ACanvas, ARect);
end;
{ TCursorProperty }
function TCursorProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paMultiSelect, paValueList, paSortList, paRevertable];
end;
function TCursorProperty.GetValue: string;
begin
Result := CursorToString(TCursor(GetOrdValue));
end;
procedure TCursorProperty.GetValues(Proc: TGetStrProc);
begin
GetCursorValues(Proc);
end;
procedure TCursorProperty.SetValue(const Value: string);
var
NewValue: Longint;
begin
if IdentToCursor(Value, NewValue) then
SetOrdValue(NewValue)
else inherited SetValue(Value);
end;
procedure TCursorProperty.ListDrawValue(const Value: string;
ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean);
var
Right: Integer;
CursorIndex: Integer;
CursorHandle: THandle;
begin
Right := ARect.Left + GetSystemMetrics(SM_CXCURSOR) + 4;
with ACanvas do
begin
if not IdentToCursor(Value, CursorIndex) then
CursorIndex := StrToInt(Value);
ACanvas.FillRect(ARect);
CursorHandle := Screen.Cursors[CursorIndex];
if CursorHandle <> 0 then
DrawIconEx(ACanvas.Handle, ARect.Left + 2, ARect.Top + 2, CursorHandle,
0, 0, 0, 0, DI_NORMAL or DI_DEFAULTSIZE);
DefaultPropertyListDrawValue(Value, ACanvas, Rect(Right, ARect.Top,
ARect.Right, ARect.Bottom), ASelected);
end;
end;
procedure TCursorProperty.ListMeasureWidth(const Value: string;
ACanvas: TCanvas; var AWidth: Integer);
begin
AWidth := AWidth + GetSystemMetrics(SM_CXCURSOR) + 4;
end;
procedure TCursorProperty.ListMeasureHeight(const Value: string;
ACanvas: TCanvas; var AHeight: Integer);
begin
AHeight := Max(ACanvas.TextHeight('Wg'), GetSystemMetrics(SM_CYCURSOR) + 4);
end;
{ TFontProperty }
procedure TFontProperty.Edit;
var
FontDialog: TFontDialog;
begin
FontDialog := TFontDialog.Create(Application);
try
FontDialog.Font := TFont(GetOrdValue);
FontDialog.HelpContext := hcDFontEditor;
FontDialog.Options := FontDialog.Options + [fdShowHelp, fdForceFontExist];
if FontDialog.Execute then SetOrdValue(Longint(FontDialog.Font));
finally
FontDialog.Free;
end;
end;
function TFontProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paMultiSelect, paSubProperties, paDialog, paReadOnly];
end;
{ TModalResultProperty }
const
ModalResults: array[mrNone..mrYesToAll] of string = (
'mrNone',
'mrOk',
'mrCancel',
'mrAbort',
'mrRetry',
'mrIgnore',
'mrYes',
'mrNo',
'mrAll',
'mrNoToAll',
'mrYesToAll');
function TModalResultProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paMultiSelect, paValueList, paRevertable];
end;
function TModalResultProperty.GetValue: string;
var
CurValue: Longint;
begin
CurValue := GetOrdValue;
case CurValue of
Low(ModalResults)..High(ModalResults):
Result := ModalResults[CurValue];
else
Result := IntToStr(CurValue);
end;
end;
procedure TModalResultProperty.GetValues(Proc: TGetStrProc);
var
I: Integer;
begin
for I := Low(ModalResults) to High(ModalResults) do Proc(ModalResults[I]);
end;
procedure TModalResultProperty.SetValue(const Value: string);
var
I: Integer;
begin
if Value = '' then
begin
SetOrdValue(0);
Exit;
end;
for I := Low(ModalResults) to High(ModalResults) do
if CompareText(ModalResults[I], Value) = 0 then
begin
SetOrdValue(I);
Exit;
end;
inherited SetValue(Value);
end;
{ TShortCutProperty }
const
ShortCuts: array[0..108] of TShortCut = (
scNone,
Byte('A') or scCtrl,
Byte('B') or scCtrl,
Byte('C') or scCtrl,
Byte('D') or scCtrl,
Byte('E') or scCtrl,
Byte('F') or scCtrl,
Byte('G') or scCtrl,
Byte('H') or scCtrl,
Byte('I') or scCtrl,
Byte('J') or scCtrl,
Byte('K') or scCtrl,
Byte('L') or scCtrl,
Byte('M') or scCtrl,
Byte('N') or scCtrl,
Byte('O') or scCtrl,
Byte('P') or scCtrl,
Byte('Q') or scCtrl,
Byte('R') or scCtrl,
Byte('S') or scCtrl,
Byte('T') or scCtrl,
Byte('U') or scCtrl,
Byte('V') or scCtrl,
Byte('W') or scCtrl,
Byte('X') or scCtrl,
Byte('Y') or scCtrl,
Byte('Z') or scCtrl,
Byte('A') or scCtrl or scAlt,
Byte('B') or scCtrl or scAlt,
Byte('C') or scCtrl or scAlt,
Byte('D') or scCtrl or scAlt,
Byte('E') or scCtrl or scAlt,
Byte('F') or scCtrl or scAlt,
Byte('G') or scCtrl or scAlt,
Byte('H') or scCtrl or scAlt,
Byte('I') or scCtrl or scAlt,
Byte('J') or scCtrl or scAlt,
Byte('K') or scCtrl or scAlt,
Byte('L') or scCtrl or scAlt,
Byte('M') or scCtrl or scAlt,
Byte('N') or scCtrl or scAlt,
Byte('O') or scCtrl or scAlt,
Byte('P') or scCtrl or scAlt,
Byte('Q') or scCtrl or scAlt,
Byte('R') or scCtrl or scAlt,
Byte('S') or scCtrl or scAlt,
Byte('T') or scCtrl or scAlt,
Byte('U') or scCtrl or scAlt,
Byte('V') or scCtrl or scAlt,
Byte('W') or scCtrl or scAlt,
Byte('X') or scCtrl or scAlt,
Byte('Y') or scCtrl or scAlt,
Byte('Z') or scCtrl or scAlt,
VK_F1,
VK_F2,
VK_F3,
VK_F4,
VK_F5,
VK_F6,
VK_F7,
VK_F8,
VK_F9,
VK_F10,
VK_F11,
VK_F12,
VK_F1 or scCtrl,
VK_F2 or scCtrl,
VK_F3 or scCtrl,
VK_F4 or scCtrl,
VK_F5 or scCtrl,
VK_F6 or scCtrl,
VK_F7 or scCtrl,
VK_F8 or scCtrl,
VK_F9 or scCtrl,
VK_F10 or scCtrl,
VK_F11 or scCtrl,
VK_F12 or scCtrl,
VK_F1 or scShift,
VK_F2 or scShift,
VK_F3 or scShift,
VK_F4 or scShift,
VK_F5 or scShift,
VK_F6 or scShift,
VK_F7 or scShift,
VK_F8 or scShift,
VK_F9 or scShift,
VK_F10 or scShift,
VK_F11 or scShift,
VK_F12 or scShift,
VK_F1 or scShift or scCtrl,
VK_F2 or scShift or scCtrl,
VK_F3 or scShift or scCtrl,
VK_F4 or scShift or scCtrl,
VK_F5 or scShift or scCtrl,
VK_F6 or scShift or scCtrl,
VK_F7 or scShift or scCtrl,
VK_F8 or scShift or scCtrl,
VK_F9 or scShift or scCtrl,
VK_F10 or scShift or scCtrl,
VK_F11 or scShift or scCtrl,
VK_F12 or scShift or scCtrl,
VK_INSERT,
VK_INSERT or scShift,
VK_INSERT or scCtrl,
VK_DELETE,
VK_DELETE or scShift,
VK_DELETE or scCtrl,
VK_BACK or scAlt,
VK_BACK or scShift or scAlt);
function TShortCutProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paMultiSelect, paValueList, paRevertable];
end;
function TShortCutProperty.GetValue: string;
var
CurValue: TShortCut;
begin
CurValue := GetOrdValue;
if CurValue = scNone then
Result := srNone else
Result := ShortCutToText(CurValue);
end;
procedure TShortCutProperty.GetValues(Proc: TGetStrProc);
var
I: Integer;
begin
Proc(srNone);
for I := 1 to High(ShortCuts) do Proc(ShortCutToText(ShortCuts[I]));
end;
procedure TShortCutProperty.SetValue(const Value: string);
var
NewValue: TShortCut;
begin
NewValue := 0;
if (Value <> '') and (AnsiCompareText(Value, srNone) <> 0) then
begin
NewValue := TextToShortCut(Value);
if NewValue = 0 then
raise EPropertyError.CreateRes(@SInvalidPropertyValue);
end;
SetOrdValue(NewValue);
end;
{ TTabOrderProperty }
function TTabOrderProperty.GetAttributes: TPropertyAttributes;
begin
Result := [];
end;
{ TCaptionProperty }
function TCaptionProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paMultiSelect, paAutoUpdate, paRevertable];
end;
{ Clipboard routines }
procedure CopyStreamToClipboard(S: TMemoryStream);
var
T: TMemoryStream;
I: TValueType;
V: Integer;
procedure CopyToClipboard(Format: Word; S: TMemoryStream);
var
Handle: THandle;
Mem: Pointer;
begin
Handle := GlobalAlloc(GMEM_MOVEABLE, S.Size);
Mem := GlobalLock(Handle);
Move(S.Memory^, Mem^, S.Size);
GlobalUnlock(Handle);
Clipboard.SetAsHandle(Format, Handle);
end;
begin
Clipboard.Open;
try
CopyToClipboard(CF_COMPONENTS, S);
S.Position := 0;
T := TMemoryStream.Create;
try
repeat
S.Read(I, SizeOf(I));
S.Seek(-SizeOf(I), 1);
if I = vaNull then Break;
ObjectBinaryToText(S, T);
until False;
V := 0;
T.Write(V, 1);
CopyToClipboard(CF_TEXT, T);
finally
T.Free;
end;
finally
Clipboard.Close;
end;
end;
function GetClipboardStream: TMemoryStream;
var
S, T: TMemoryStream;
Handle: THandle;
Mem: Pointer;
Format: Word;
V: TValueType;
function AnotherObject(S: TStream): Boolean;
var
Buffer: array[0..255] of Char;
Position: Integer;
begin
Position := S.Position;
Buffer[S.Read(Buffer, SizeOf(Buffer))-1] := #0;
S.Position := Position;
Result := PossibleStream(Buffer);
end;
begin
Result := TMemoryStream.Create;
try
if Clipboard.HasFormat(CF_COMPONENTS) then
Format := CF_COMPONENTS else
Format := CF_TEXT;
Clipboard.Open;
try
Handle := Clipboard.GetAsHandle(Format);
Mem := GlobalLock(Handle);
try
Result.Write(Mem^, GlobalSize(Handle));
finally
GlobalUnlock(Handle);
end;
finally
Clipboard.Close;
end;
Result.Position := 0;
if Format = CF_TEXT then
begin
S := TMemoryStream.Create;
try
while AnotherObject(Result) do ObjectTextToBinary(Result, S);
V := vaNull;
S.Write(V, SizeOf(V));
T := Result;
Result := nil;
T.Free;
except
S.Free;
raise;
end;
Result := S;
Result.Position := 0;
end;
except
Result.Free;
raise;
end;
end;
type
TSelectionMessageList = class(TInterfacedObject, ISelectionMessageList)
private
FList: IInterfaceList;
protected
procedure Add(AEditor: ISelectionMessage);
public
constructor Create;
function Get(Index: Integer): ISelectionMessage;
function GetCount: Integer;
property Count: Integer read GetCount;
property Items[Index: Integer]: ISelectionMessage read Get; default;
end;
{ TSelectionMessageList }
procedure TSelectionMessageList.Add(AEditor: ISelectionMessage);
begin
FList.Add(AEditor);
end;
constructor TSelectionMessageList.Create;
begin
inherited;
FList := TInterfaceList.Create;
end;
function TSelectionMessageList.Get(Index: Integer): ISelectionMessage;
begin
Result := FList[Index] as ISelectionMessage;
end;
function TSelectionMessageList.GetCount: Integer;
begin
Result := FList.Count;
end;
function SelectionMessageListOf(const SelectionEditorList: ISelectionEditorList): ISelectionMessageList;
var
SelectionMessage: ISelectionMessage;
I: Integer;
R: TSelectionMessageList;
begin
R := TSelectionMessageList.Create;
for I := 0 to SelectionEditorList.Count - 1 do
if Supports(SelectionEditorList[I], ISelectionMessage, SelectionMessage) then
R.Add(SelectionMessage);
Result := R;
end;
{ EditAction utility functions }
function EditActionFor(AEditControl: TCustomEdit; Action: TEditAction): Boolean;
begin
Result := True;
case Action of
eaUndo: AEditControl.Undo;
eaCut: AEditControl.CutToClipboard;
eaCopy: AEditControl.CopyToClipboard;
eaDelete: AEditControl.ClearSelection;
eaPaste: AEditControl.PasteFromClipboard;
eaSelectAll: AEditControl.SelectAll;
else
Result := False;
end;
end;
function GetEditStateFor(AEditControl: TCustomEdit): TEditState;
begin
Result := [];
if AEditControl.CanUndo then
Include(Result, esCanUndo);
if AEditControl.SelLength > 0 then
begin
Include(Result, esCanCut);
Include(Result, esCanCopy);
Include(Result, esCanDelete);
end;
if Clipboard.HasFormat(CF_TEXT) then
Include(Result, esCanPaste);
if AEditControl.SelLength < Length(AEditControl.Text) then
Include(Result, esCanSelectAll);
end;
initialization
CF_COMPONENTS := RegisterClipboardFormat('Delphi Components');
NotifyGroupChange(UnregisterActionGroup);
finalization
UnNotifyGroupChange(UnregisterActionGroup);
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -