📄 jvireg.pas
字号:
{-----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: JvIReg.PAS, released on 2002-07-04.
The Initial Developers of the Original Code are: Andrei Prygounkov <a dott prygounkov att gmx dott de>
Copyright (c) 1999, 2002 Andrei Prygounkov
All Rights Reserved.
Contributor(s):
Last Modified: 2002-07-04
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.sourceforge.net
Description : Register JvInterpreter components
Known Issues:
-----------------------------------------------------------------------------}
{$I JVCL.INC}
// Enable new property editor for integer types
{$DEFINE JvInterpreter_INTEGERPROPERTY}
// enables dblclick feature in new property editor
{.$DEFINE JvInterpreter_INTEGERPROPERTY_DBLCLICK}
unit JvIReg;
interface
procedure Register;
implementation
uses
SysUtils, Classes, TypInfo,
{$IFDEF COMPILER6_UP}
DesignIntf, DesignEditors,
{$ELSE}
DsgnIntf,
{$ENDIF COMPILER6_UP}
{$IFDEF VCL}
JvInterpreterFm,
{$ENDIF VCL}
JvInterpreter, JvxDConst;
{$R ..\resources\rai.dcr}
{$IFDEF JvInterpreter_INTEGERPROPERTY}
type
TJvIntegerProperty = class(TIntegerProperty)
private
Component: TPersistent;
JvInterpreterP: TJvInterpreterProgram;
procedure JvInterpreterPGetValue(Sender: TObject; Identifier: string;
var Value: Variant; Args: TJvInterpreterArgs; var Done: Boolean);
public
procedure SetValue(const Value: string); override;
{$IFDEF JvInterpreter_INTEGERPROPERTY_DBLCLICK}
procedure Edit; override;
{$ENDIF JvInterpreter_INTEGERPROPERTY_DBLCLICK}
end;
type
THackJvInterpreterProgram = class(TJvInterpreterProgram);
procedure TJvIntegerProperty.JvInterpreterPGetValue(Sender: TObject; Identifier: string;
var Value: Variant; Args: TJvInterpreterArgs; var Done: Boolean);
var
Com: TComponent;
begin
if (Component is TComponent) and (Args.Obj = nil) then
begin
Com := (Component as TComponent).Owner.FindComponent(Identifier);
if Com <> nil then
begin
Value := O2V(Com);
Done := True;
end
else
begin
Args.Obj := Component;
Args.ObjTyp := varObject;
try
Done := THackJvInterpreterProgram(JvInterpreterP).GetValue(Identifier, Value, Args);
finally
Args.Obj := nil;
Args.ObjTyp := 0;
end;
end;
end;
end;
procedure TJvIntegerProperty.SetValue(const Value: string);
function Calc: Longint;
begin
if JvInterpreterP = nil then
begin
JvInterpreterP := TJvInterpreterProgram.Create(nil);
JvInterpreterP.OnGetValue := JvInterpreterPGetValue;
end;
JvInterpreterP.Source := Value;
JvInterpreterP.Run;
Result := JvInterpreterP.VResult;
end;
var
Int: Longint;
PropInf: PPropInfo;
I: Integer;
begin
try
{ if Value is a simple integer we do not need to run JvInterpreter }
Int := StrToInt(Value);
SetOrdValue(Int);
except
{ and now we really need to do this }
for I := 0 to PropCount - 1 do
begin
Component := GetComponent(I) as TPersistent;
Int := Calc;
PropInf := TypInfo.GetPropInfo(Component.ClassInfo, GetName);
if PropInf <> nil then
SetOrdProp(Component, PropInf, Int);
Modified;
end;
end;
end;
{$IFDEF JvInterpreter_INTEGERPROPERTY_DBLCLICK}
procedure TJvIntegerProperty.Edit;
var
Int, P: Longint;
PropInf: PPropInfo;
I: Integer;
Component: TPersistent;
begin
for I := 0 to PropCount - 1 do
begin
Component := GetComponent(I) as TPersistent;
PropInf := TypInfo.GetPropInfo(Component.ClassInfo, GetName);
if PropInf <> nil then
begin
Int := GetOrdProp(Component, PropInf);
{$R-}
if KeyPressed(VK_CONTROL) then
P := 10
else
P := 1;
if KeyPressed(VK_SHIFT) then
Dec(Int, P)
else
Inc(Int, P);
{$R+}
SetOrdProp(Component, PropInf, Int);
Modified;
end;
end;
end;
{$ENDIF JvInterpreter_INTEGERPROPERTY_DBLCLICK}
{$ENDIF JvInterpreter_INTEGERPROPERTY}
procedure Register;
begin
{JvInterpreter unit}
RegisterComponents(srJvInterpreterPalette, [TJvInterpreterProgram]);
{$IFDEF VCL}
RegisterComponents(srJvInterpreterPalette, [TJvInterpreterFm]);
{$ENDIF VCL}
{$IFDEF JVCL_REGISTER_GLOBAL_DESIGNEDITORS}
{$IFDEF JvInterpreter_INTEGERPROPERTY}
RegisterPropertyEditor(TypeInfo(Integer), TObject, '', TJvIntegerProperty);
RegisterPropertyEditor(TypeInfo(Cardinal), TObject, '', TJvIntegerProperty);
RegisterPropertyEditor(TypeInfo(Longint), TObject, '', TJvIntegerProperty);
RegisterPropertyEditor(TypeInfo(Smallint), TObject, '', TJvIntegerProperty);
RegisterPropertyEditor(TypeInfo(Shortint), TObject, '', TJvIntegerProperty);
RegisterPropertyEditor(TypeInfo(Word), TObject, '', TJvIntegerProperty);
RegisterPropertyEditor(TypeInfo(Byte), TObject, '', TJvIntegerProperty);
{$ENDIF JvInterpreter_INTEGERPROPERTY}
{$ENDIF}
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -